Как работает аргумент ключевого слова?

У меня есть пример кода:

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) вместо.

Другие вопросы по тегам