【问题标题】:Ruby hash error: undefined method []Ruby 哈希错误:未定义的方法 []
【发布时间】:2012-05-10 16:16:26
【问题描述】:

我有一段这样的代码:

my_hash = {}
first_key = 1
second_key = 2
third_key = 3
my_hash[first_key][second_key][third_key] = 100

ruby 解释器给了我一个错误说:

nil:NilClass (NoMethodError) 的未定义方法 `[]'

这是否意味着我不能像那样使用哈希?还是您认为此错误可能是由于其他原因?

【问题讨论】:

  • 关于如何调试代码的提示:stackoverflow.com/q/3955688/38765
  • 艾伦,您可能应该接受其中一个答案,除非您认为您的问题没有得到完全回答。 (可能是 texasbruce 的或我的,因为我们告诉了你一种实现你想要的方法。虽然我重申这不一定是好的风格。)

标签: ruby hash


【解决方案1】:

默认情况下,哈希不嵌套。由于my_hash[first_key] 没有设置为任何值,所以它是nil。而nil 不是哈希,因此尝试访问其中一个元素会失败。

所以:

my_hash = {}
first_key = 1
second_key = 2
third_key = 3

my_hash[first_key] # nil
my_hash[first_key][second_key]
# undefined method `[]' for nil:NilClass (NoMethodError)

my_hash[first_key] = {}
my_hash[first_key][second_key] # nil

my_hash[first_key][second_key] = {}

my_hash[first_key][second_key][third_key] = 100
my_hash[first_key][second_key][third_key] # 100

【讨论】:

  • 您好,谢谢,但实际上我将哈希设置为静态 (@@my_hash),那么子哈希也会是静态的吗?那么如果我把这段代码放在一个循环中,sub_hashes就不会再初始化了?
  • @AllanJiang Ruby 中没有“静态”之类的东西。
【解决方案2】:

你不能使用这样的哈希值; my_hash[first_key] 只是 nil,然后下一个索引操作失败。可以创建一个哈希对象,其行为方式与您正在寻找的方式相同——参见http://t-a-w.blogspot.co.uk/2006/07/autovivification-in-ruby.html——但尚不清楚这是一种好的风格。

【讨论】:

  • 感谢您的回答!我对此还有另一个问题,请查看我在另一个答案下的评论。谢谢
【解决方案3】:

您使用哈希的方式在 Ruby 中无效,因为必须先将每个单个值分配给一个哈希,然后才能使用嵌套哈希(我想您来自 PHP?),但您可以使用 vivified 哈希:

my_hash = Hash.new{|h,k| h[k]=Hash.new(&h.default_proc)}
first_key = 1
second_key = 2
third_key = 3
my_hash[first_key][second_key][third_key] = 100
p my_hash

#output: {1=>{2=>{3=>100}}}

这是您可能会感到舒服的方式。

【讨论】:

  • 很好,不知道default_proc
【解决方案4】:

你可以这样做

class NilClass

  def [] key
    nil
  end

end

nil_overrides.rb 这样的初始化程序中,您将能够使用 nil['xxx']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多