Итак, я обнаружил это рубиновое поведение, которое сводило меня с ума больше часа. Когда я передаю хэш функции, которая имеет значение по умолчанию для хеша И аргумент ключевого слова, кажется, что ссылка передается неправильно. Как только я убираю значение по умолчанию ИЛИ аргумент ключевого слова, функция ведет себя так, как ожидалось. Я пропустил здесь какое-то очевидное рубиновое правило?
def change_hash(h={}, rand: om)
h['hey'] = true
end
k = {}
change_hash(k)
k
#=> {}
Он отлично работает, как только я убираю значение по умолчанию или ключевое слово arg.
def change_hash(h, rand: om)
h['hey'] = true
end
k = {}
change_hash(k)
k
#=> {'hey' => true}
def change_hash(h={})
h['hey'] = true
end
k = {}
change_hash(k)
k
#=> {'hey' => true}
РЕДАКТИРОВАТЬ
Спасибо за ваши ответы. Большинство из вас отметили, что ruby в некоторых случаях анализирует хэш как аргумент ключевого слова. Однако я говорю о случае, когда хэш имеет строковые ключи. Когда я передаю хеш, кажется, что переданное значение верно. Но изменение хеша внутри функции не изменяет исходный хеш.
def change_hash(hash={}, another_arg: 300)
puts "another_arg: #{another_arg}"
puts "hash: #{hash}"
hash['hey'] = 3
end
my_hash = {"o" => 3}
change_hash(my_hash)
puts my_hash
Распечатывает
another_arg: 300
hash: {"o"=>3}
{"o"=>3}