Подтвердить что ты не робот

Создайте рубиновый метод, который принимает хэш параметров

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

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

Каков прототип метода, который принимает такие параметры? Как я их читаю?

4b9b3361

Ответ 1

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

def login_success(hsh = {})
  puts hsh[:msg]
end

Ответ 2

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

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"

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

Ответ 3

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

def login_success arg
 # Your code here
end

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

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

def login_success arg
  raise Exception.new('Argument not a Hash...') unless arg.is_a? Hash
  # Your code here
end

Ответ 4

С появлением аргументов Keyword в 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