我似乎在使用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中不起作用?我该如何解决它?
因为从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)
您不需要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中.因此,即使看起来你正在为函数提供多个参数,解释器实际上只接收一个参数.
| 归档时间: |
|
| 查看次数: |
929 次 |
| 最近记录: |