ruby - 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 (类型错误)

为什么这在 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/

相关文章:

ruby - 如何根据值的索引拆分数组?

ruby - 如何在给定数组中的某个元素的情况下找到下一个元素

ruby - 使用 Python 运行 Ruby 脚本

ruby-on-rails - 在 Rails 中按时间属性对数组进行排序

android - 使用 irb() 接口(interface)时出错 - HTTPClient::KeepAliveDisconnected 解析头中 block 中的救援

ruby-on-rails - 避免在 meta_search 中选择 * 查询

ruby-on-rails - 在 Hartl 教程之后向 Rails 应用程序添加密码重置功能

ruby-on-rails - Rspec Controller 测试没有命中我的 Controller 操作

ruby - 运行 ruby​​ 脚本时出错 "Insecure world writable dir foo in PATH"

ruby - 给定一个日期,如何确定它是该月的第二个还是第四个星期六