【问题标题】:ruby 2.0 named parameters from a hash来自哈希的 ruby​​ 2.0 命名参数
【发布时间】:2013-04-28 10:18:39
【问题描述】:

如果我在 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] 访问各个参数)

【问题讨论】:

  • 请复制粘贴您的确切代码,因为您提供的代码应该可以工作。
  • 您的代码似乎运行正常

标签: ruby ruby-2.0


【解决方案1】:

如果您的函数使用关键字参数,则需要使用 **(双 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"

【讨论】:

    【解决方案2】:

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

    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"
    

    【讨论】:

      【解决方案3】:

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

      这种情况,你可以试试:

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

      传递值。

      【讨论】:

      • 我认为您对这个问题感到困惑。它指的是命名参数,这是 Ruby 2.0 的一个特性。
      猜你喜欢
      • 2013-07-20
      • 2012-12-13
      • 2013-01-19
      • 2011-10-27
      • 2014-05-11
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多