创build一个接受散列参数的ruby方法

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

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

什么是接受这种参数的方法的原型? 我如何阅读?

如果你用哈希语法将parameter passing给一个Ruby函数,Ruby会认为这是你的目标。 从而:

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

关键要记住的是,如果散列参数是函数的最后一个参数,则只能使用散列字符{}的语法。 所以你可以做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" 

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

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

随着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会引发一个ArgumentError