У меня есть следующий метод:Странное поведение метод с дополнительным первым параметром хеш и keyword_args
def test(first_param = nil, keyword_arg: nil)
puts "first_param: #{first_param}"
puts "keyword_arg: #{keyword_arg}"
end
Все последующие вызовы делать то, что я ожидаю, что они делают:
test(:something)
#=> first_param: something
# keyword_arg:
test(nil, keyword_arg: :keyword_arg)
#=> first_param:
# keyword_arg: keyword_arg
test({ first_param: :is_a_hash }, keyword_arg: :is_still_working)
#=> first_param: {:first_param=>:is_a_hash}
# keyword_arg: is_still_working
Но опуская дополнительный keyword_arg
и передача хэша в качестве первого аргумента дает мне ошибку:
test(first_param: :is_a_hash)
#=> test.rb:1:in `test': unknown keyword: first_param (ArgumentError)
# from test.rb:12:in `<main>'
Я бы необходимо установить first_param
на номер { first_param: :is_hash }
и keyword_arg
, являющийся nil
.
Кажется, что интерпретирует каждый хэш в качестве ключевого слова арг:
test(keyword_arg: :should_be_first_param)
#=> first_param:
# keyword_arg: should_be_first_param
Это должно установить first_param
в { keyword_arg: :should_be_first_param }
, оставив keyword_arg
nil
на мой взгляд.
Является ли это ошибкой анализатора или ожидаемым поведением? Протестировано по рубинам 2.3.0 и 2.2.4.
Edit: Создание первого параметра обязательного и все работает, как я бы ожидать:
def test_mandatory(first_param, keyword_arg: nil)
puts "first_param: #{first_param}"
puts "keyword_arg: #{keyword_arg}"
end
test_mandatory(first_param: :is_a_hash)
#=> first_param: {:first_param=>:is_a_hash}
# keyword_arg:
test_mandatory(keyword_arg: :should_be_first_param)
#=> first_param: {:keyword_arg=>:should_be_first_param}
# keyword_arg:
Я ожидаю, что делает параметр опциональным не изменяет путь параметры разобранные.
Я открыл issue on bugs.ruby-lang.org, а затем разработчики могут выяснить, предназначено ли это так или побочный эффект аргументов kword.
"* Это должно быть установлено' first_param' для '. {Keyword_arg:: should_be_first_param}', оставляя '' keyword_arg' nil' на мой взгляд *" - Зачем? Разве вы не ожидали бы двусмысленности? – sawa
Я даю только один параметр методу. Когда это не хэш, он устанавливает 'first_param' (' test (: something) '). Но если параметр является хешем, он не устанавливает 'first_param', а интерпретирует хэш как аргументы ключевого слова. Почему поведение зависит от типа параметра? Это не логично (по крайней мере, для меня). – Markus