我在 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 (类型错误)
为什么这在 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 将一组散列键/值对视为函数的最后一个参数时,它会自动包装到散列中。因此,即使看起来您向函数提供了多个参数,解释器实际上只接收一个参数。
关于ruby - 1.9.* 中的哈希构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8143532/