如果我在ruby中有一个带有命名参数的方法......
def smoosh(first: nil, second: nil)
first + second
end
如果密钥匹配,最简单的方法是将哈希值传递给该方法:
params = { first: 'peanut', second: 'butter' }
smoosh(params)
以上产生参数错误。
看起来这可能是Sinatra参数如何工作的问题。
当我这样做时:
get 'a_sinatra_route' do
hash = params.clone
hash.symbolize_keys!
smoosh(hash)
end
工作正常。当它们自己传递参数时它不起作用。 (即使您可以使用符号键params[:attr]
)
答案 0 :(得分:12)
似乎对我来说很好。
2.0.0p0 :007 > def smoosh(first: nil, second: nil)
2.0.0p0 :008?> first + second
2.0.0p0 :009?> end
=> nil
2.0.0p0 :010 > params = { first: 'peanut', second: 'butter' }
=> {:first=>"peanut", :second=>"butter"}
2.0.0p0 :012 > smoosh(params)
=> "peanutbutter"
答案 1 :(得分:1)
如果您的函数使用关键字参数,则需要使用 **(双斜杠)。 The ** (introduced in Ruby 2.0) 的作用类似于原始 * 运算符,但可以与哈希一起使用(另请参阅:another good resource):
def smoosh(first: nil, second: nil)
first + second
end
params = { first: 'double', second: 'splat' }
smoosh(**params)
=> "doublesplat"
答案 2 :(得分:-6)
它抛出一个ArgumentError,因为你将一个哈希传递给一个带两个参数的方法 - 即使哈希有两个键/值对,它仍然只是一个参数!
在这种情况下,您可以尝试:
smoosh(params[:first], params[:second])
传入值。