ruby 2.0从散列中命名参数

uinbv5nw  于 2023-03-08  发布在  Ruby
关注(0)|答案(4)|浏览(101)

如果我有一个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]访问单个参数)

nnt7mjpx

nnt7mjpx1#

对我来说似乎很好。

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"
vxf3dgd4

vxf3dgd42#

如果函数使用关键字参数,则需要使用**(double splat)。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"
chhqkbe1

chhqkbe13#

这应该在ruby 2中起作用,但在ruby 3中不起作用,因为散列不再转换为关键字参数。

oxf4rvwz

oxf4rvwz4#

它抛出ArgumentError是因为您将 * 一个 * 散列传递给一个接受两个参数的方法--即使散列有两个键/值对,它仍然只是一个参数!
在这种情况下,您可以尝试:

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

传入值。

相关问题