ruby 2.0 именованные параметры из хеша

Если у меня есть метод в ruby, который принимает именованные аргументы...

def smoosh(first: nil, second: nil)
    first + second
end

Какой самый простой способ передать хэш этому методу, если ключи совпадают:

params = { first: 'peanut', second: 'butter' }

smoosh(params)

Приведенное выше приводит к ошибке аргумента.

Обновлять:

Похоже, это может быть проблема с тем, как работают параметры Sinatra.

Когда я делаю:

get 'a_sinatra_route' do
  hash = params.clone
  hash.symbolize_keys!

  smoosh(hash)
end

Это работает нормально. Это не работает, когда просто передаются параметры сами по себе. (хотя вы можете получить доступ к отдельным параметрам с помощью символьной клавиши params[:attr])


person Christian Schlensker    schedule 03.05.2013    source источник
comment
Пожалуйста, скопируйте и вставьте свой точный код, так как то, что вы дали, должно работать.   -  person Marc-André Lafortune    schedule 04.05.2013
comment
Ваш код работает правильно   -  person Nickolay Kondratenko    schedule 16.04.2015


Ответы (3)


Кажется, работает просто отлично для меня.

2.0.0p0 :007 > def smoosh(first: nil, second: nil)
2.0.0p0 :008?>   first + second
2.0.0p0 :009?> end
 => nil
2.0.0p0 :010 > params = { first: 'peanut', second: 'butter' }
 => {:first=>"peanut", :second=>"butter"}
2.0.0p0 :012 > smoosh(params)
 => "peanutbutter"
person Chris Heald    schedule 03.05.2013

Если ваша функция использует аргументы ключевого слова, вам нужно будет использовать ** (двойной знак). Значок ** (появившийся в Ruby 2.0) действует как оригинальный оператор *, но может использоваться с хешами (см. также: еще один хороший ресурс):

def smoosh(first: nil, second: nil)
  first + second
end

params = { first: 'double', second: 'splat' }    

smoosh(**params)
=> "doublesplat"
person gangelo    schedule 14.05.2021

Он выдает ошибку ArgumentError, потому что вы передаете один хэш методу, который принимает два аргумента. Несмотря на то, что хэш имеет две пары ключ/значение, это всего лишь один аргумент!

В этой ситуации вы можете попробовать:

smoosh(params[:first], params[:second])

Для передачи значений.

person hlh    schedule 03.05.2013
comment
Я думаю, вы запутались в вопросе. Это относится к именованным аргументам, функции Ruby 2.0. - person Marc-André Lafortune; 04.05.2013