Как работает аргумент ключевого слова?
У меня есть пример кода:
def m(args = nil, **kwargv)
puts kwargv
a = args or {}
puts a
kwargv['a'] = a
puts kwargv
end
Когда я призываю:
m(args = {'c':'d'})
m(args: {'c': 'd'})
m(args = {xxx}, {})
только в последнем будет args
быть интерпретированным как args
; в первом и втором, дикт будет использоваться как kwargv
,
Есть ли более элегантный способ указать args
как диктовать?
1 ответ
Это должно работать:
> m({'c' => 'd'})
# {}
# {"c"=>"d"}
# {"a"=>{"c"=>"d"}}
# => nil
Логика этого заключается в том, что, поскольку первый аргумент является необязательным (по умолчанию nil
), а последний аргумент является ключевым словом-аргументом, передавая хеш с символьными ключами (m({ :c => 'd'})
) будет интерпретироваться как ключевое слово hash. Любой другой тип аргумента будет передан в качестве первого параметра. Если вам действительно необходимо передать хеш-код ключевого слова в качестве первого параметра, вам также необходимо явно передать второй параметр:
> m({ :c => 'd' }, {})
# {}
# {:c=>"d"}
# {"a"=>{:c=>"d"}}
С другой стороны, вызов метода во время именования args
параметр (m(args=something)
) является излишним, и на самом деле делает что-то другое, чем вы думаете (присваивает something
в локальную переменную с именем args
, а затем передать его в метод). использование m(something)
вместо.