ruby 2.0从哈希中命名参数

Chr*_*ker 6 ruby ruby-2.0

如果我在ruby中有一个带有命名参数的方法......

def smoosh(first: nil, second: nil)
    first + second
end
Run Code Online (Sandbox Code Playgroud)

如果密钥匹配,最简单的方法是将哈希值传递给该方法:

params = { first: 'peanut', second: 'butter' }

smoosh(params)
Run Code Online (Sandbox Code Playgroud)

上面会产生一个参数错误.

更新:

看起来这可能是Sinatra参数如何工作的问题.

当我做:

get 'a_sinatra_route' do
  hash = params.clone
  hash.symbolize_keys!

  smoosh(hash)
end
Run Code Online (Sandbox Code Playgroud)

它工作正常.当它们自己传递参数时它不起作用.(即使您可以使用符号键访问各个参数params[:attr])

Chr*_*ald 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"
Run Code Online (Sandbox Code Playgroud)


gan*_*elo 11

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

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

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

smoosh(**params)
=> "doublesplat"
Run Code Online (Sandbox Code Playgroud)


hlh*_*hlh -7

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

遇到这种情况,您可以尝试:

smoosh(params[:first], params[:second])
Run Code Online (Sandbox Code Playgroud)

传递值。

  • 我认为你对这个问题感到困惑。它指的是命名参数,这是 Ruby 2.0 的一项功能。 (3认同)