ruby 2.0从哈希中命名参数

时间:2013-05-03 22:46:18

标签: ruby ruby-2.0

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

访问各个参数

3 个答案:

答案 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])

传入值。