我似乎在使用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中不起作用?我该如何解决它?
答案 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中。因此,即使您为函数提供多个参数,解释器实际上只接收一个参数。