创建一个接受参数哈希的ruby方法

时间:2009-02-24 20:23:23

标签: ruby

我知道这可能是一个愚蠢的问题,但我不知道如何创建一个接受参数哈希的ruby方法。我的意思是,在Rails中我想使用这样的方法:

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

接受此类参数的方法的原型是什么?我怎么读它们?

4 个答案:

答案 0 :(得分:62)

如果您使用哈希语法将参数传递给Ruby函数,Ruby会认为这是您的目标。这样:

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

答案 1 :(得分:32)

要记住的一个关键事项是,如果hash参数是函数的最后一个参数,那么只能省略散列字符{}。所以你可以做Allyn做的事情,那样就可以了。还

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"

但是如果哈希不是最后一个参数,则必须使用{}包围哈希元素。

答案 2 :(得分:11)

随着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

答案 3 :(得分:5)

使用一个参数。 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