创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