我有一段这样的代码:
my_hash = {}
first_key = 1
second_key = 2
third_key = 3
my_hash[first_key][second_key][third_key] = 100
并且红宝石翻译给了我一个错误说:
未定义的方法`[]'为nil:NilClass(NoMethodError)
这是否意味着我不能像那样使用哈希?或者你认为这个错误可能是因为别的东西?
答案 0 :(得分:10)
默认情况下,嵌套不会嵌套。由于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
不是哈希,因此尝试访问其中一个元素失败。
所以:
{{1}}
答案 1 :(得分:7)
你使用hash的方式在Ruby中是无效的,因为在进入嵌套哈希之前必须先将每个值分配给一个哈希(我想你是来自PHP?),但你可以使用vivified hash:< / p>
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 :(得分:2)
你不能使用这样的哈希; my_hash[first_key]
只是nil,然后下一个索引操作失败。可以使哈希对象以您正在寻找的方式运行 - 请参阅http://t-a-w.blogspot.co.uk/2006/07/autovivification-in-ruby.html - 但目前尚不清楚这是不错的风格。
答案 3 :(得分:0)
您可以执行类似
的操作class NilClass
def [] key
nil
end
end
在nil_overrides.rb
等初始值设定项中,您可以使用nil['xxx']
。