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

我似乎在使用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中不起作用? 我该如何解决它?

您不需要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中。 因此,即使看起来你正在为函数提供多个参数,解释器实际上只接收一个参数。

因为从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