我有一段像这样的代码:
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)
这意味着我不能像那样使用哈希吗?还是你认为这个错误可能是因为其他原因造成的?
我有一段像这样的代码:
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)
这意味着我不能像那样使用哈希吗?还是你认为这个错误可能是因为其他原因造成的?
默认情况下,哈希表不支持嵌套。由于 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您在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}}}
my_hash[first_key]
只是一个空值,然后下一次索引操作会失败。可以创建一个能够以您期望的方式运行的哈希对象--请参阅http://t-a-w.blogspot.co.uk/2006/07/autovivification-in-ruby.html--但这并不清楚是否是良好的编程风格。class NilClass
def [] key
nil
end
end
nil_overrides.rb
这样的初始化器中,您将能够使用 nil['xxx']
。