1.9中的哈希构造函数参数.*

Ric*_*kes 2 ruby

我似乎在使用Ruby参数到Ruby 1.9.2中的构造函数时遇到了问题.我注意到我正在尝试做的工作在1.8.7.这是我的示例代码:

def initialize(*params)
    @attr1 = params[:attr1] or nil
    @attr2 = params[:attr2] or nil
end
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试实例化此示例类的对象时,我在设置第一个实例变量的行上收到错误消息: in '[]': can't convert Symbol into Integer (TypeError)

为什么这在1.9.2中不起作用?我该如何解决它?

War*_*Hog 5

因为从splat *符号你将你的哈希实际参数转换为数组:

class Test
  def initialize(*params)
    p params
  end
end

Test.new(attr1: 1, attr2: 2)  # => [{:attr1=>1, :attr2=>2}]
Run Code Online (Sandbox Code Playgroud)

*initialize方法中删除:

class Test
  def initialize(params)
    @attr1 = params[:attr1] or nil
    @attr2 = params[:attr2] or nil
  end

  attr_accessor :attr1, :attr2
end

test = Test.new(attr1: 1, attr2: 2)
test.attr1  #= > 1
Run Code Online (Sandbox Code Playgroud)


Emi*_*ily 5

您不需要splat(*)来捕获单个哈希参数.它用于捕获未知数量的参数.将您的函数定义更改为

def initialize(params = {})
    @attr1 = params[:attr1] or nil
    @attr2 = params[:attr2] or nil
end
Run Code Online (Sandbox Code Playgroud)

一切都应该按照你期望的方式运作.编辑:params = {}做把params参数可选,并将其设置为空哈希提供没事的时候.

params使用现在的函数定义实际捕获的内容将是这样的:

Whatever.new(:foo => 'foo', :bar => 'bar')
# params contains [{:foo => 'foo', :bar => 'bar'}]
Run Code Online (Sandbox Code Playgroud)

所以你需要先进入数组才能得到哈希值,然后使用哈希键.

当Ruby看到一组散列键/值对作为函数的最后一个参数时,它会自动包装到Hash中.因此,即使看起来你正在为函数提供多个参数,解释器实际上只接收一个参数.