9

如果我在 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]

4

3 回答 3

14

似乎对我来说工作得很好。

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"
于 2013-05-03T22:53:42.960 回答
4

如果您的函数使用关键字参数,则需要使用 ** (double splat)。**(在 Ruby 2.0 中引入)的行为类似于原始的 * 运算符,但可以与 Hashes 一起使用(另请参阅:另一个好的资源):

def smoosh(first: nil, second: nil)
  first + second
end

params = { first: 'double', second: 'splat' }    

smoosh(**params)
=> "doublesplat"
于 2021-05-14T10:11:44.590 回答
-7

它抛出 ArgumentError 是因为您将一个哈希传递给一个接受两个参数的方法 - 即使哈希有两个键/值对,它仍然只是一个参数!

在这种情况下,您可以尝试:

smoosh(params[:first], params[:second])

传递值。

于 2013-05-03T22:50:14.027 回答