Создайте метод ruby, который принимает хэш параметров - PullRequest
57 голосов
/ 24 февраля 2009

Я знаю, что это может быть глупым вопросом, но я не знаю, как создать метод ruby, который принимает хэш параметров. Я имею в виду, что в Rails я бы хотел использовать такой метод:

login_success :msg => "Success!", :gotourl => user_url

Что является прототипом метода, который принимает параметры такого типа? Как я могу их прочитать?

Ответы [ 4 ]

62 голосов
/ 24 февраля 2009

Если вы передадите параметры в функцию Ruby с синтаксисом хеширования, Ruby примет это за вашу цель Таким образом:

def login_success(hsh = {})
  puts hsh[:msg]
end
32 голосов
/ 24 февраля 2009

Ключевым моментом, который следует помнить, является то, что вы можете использовать только тот синтаксис, в котором вы пропускаете хеш-символы {}, если хеш-параметр является последним параметром функции. Таким образом, вы можете сделать то, что сделал Аллин, и это сработает. Также

def login_success(name, hsh)
  puts "User #{name} logged in with #{hsh[:some_hash_key]}"
end

И вы можете позвонить с

login_success "username", :time => Time.now, :some_hash_key => "some text"

Но если хэш не является последним параметром, вы должны окружить элементы хеша {}.

11 голосов
/ 30 апреля 2015

С появлением аргументов ключевых слов в Ruby 2.0 теперь вы можете делать

def login_success(msg:"Default", gotourl:"http://example.com")
  puts msg
  redirect_to gotourl
end

В Ruby 2.1 вы можете не указывать значения по умолчанию,

def login_success(msg:, gotourl:)
  puts msg
  redirect_to gotourl
end

При вызове, если параметр не имеет значения по умолчанию, будет получено значение ArgumentError

5 голосов
/ 26 февраля 2013

Используйте один единственный аргумент. Ruby преобразует именованные значения в хеш:

def login_success arg
 # Your code here
end

login_success :msg => 'Success!', :gotourl => user_url
# => login_success({:msg => 'Success!', :gotourl => user_url})

Если вы действительно хотите удостовериться в том, что получили хеш вместо стандартной по умолчанию рубиновой утки, вам нужно будет это контролировать. Что-то вроде, например:

def login_success arg
  raise Exception.new('Argument not a Hash...') unless arg.is_a? Hash
  # Your code here
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...