Ruby哈希错误:尝试设置深度嵌套键时出现未定义方法[]。

10

我有一段像这样的代码:

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

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

undefined method `[]' for nil:NilClass (NoMethodError)

这意味着我不能像那样使用哈希吗?还是你认为这个错误可能是因为其他原因造成的?


如何调试您的代码提示:https://dev59.com/VW865IYBdhLWcg3wKLT5 - Andrew Grimm
艾伦,你应该接受其中一个答案,除非你认为你的问题没有被完全回答。(可能是texasbruce或我的其中之一,因为我们告诉了你实现你想要的方法。尽管我要重申这不一定是好的编程风格。) - Gareth McCaughan
4个回答

12

默认情况下,哈希表不支持嵌套。由于 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),那么子哈希表也是静态的吗?如果我把这段代码放在一个循环中,那么子哈希表就不会被重新初始化了吗? - Allan Jiang
5
Ruby 中没有所谓的“静态”。 - Andrew Grimm

8

您在Ruby中使用哈希的方式是不正确的,因为每个单独的值必须先被分配到哈希中,然后才能进入嵌套的哈希(我猜您是来自PHP?),但您可以使用vivified hash:

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}}}

这是你可能更加适应的方式。

2

0
你可以这样做
class NilClass

  def [] key
    nil
  end

end

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接