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

时间:2011-11-15 21:41:55

标签: ruby

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

Test.new(attr1: 1, attr2: 2)  # => [{:attr1=>1, :attr2=>2}]

*方法移除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

答案 1 :(得分:5)

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

def initialize(params = {})
    @attr1 = params[:attr1] or nil
    @attr2 = params[:attr2] or nil
end

一切都应该按照你期望的方式运作。 编辑: params = {}使params参数可选,并在没有提供任何内容时将其设置为空哈希。

params中实际捕获的具有现在功能定义的内容将是这样的:

Whatever.new(:foo => 'foo', :bar => 'bar')
# params contains [{:foo => 'foo', :bar => 'bar'}]

因此您需要首先进入数组以获取哈希值,然后使用哈希键。

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