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

kr98yfug  于 2022-12-18  发布在  Ruby
关注(0)|答案(4)|浏览(87)

我有这样一段代码:

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

ruby解释器给了我一个错误
未定义nil的方法“[]”:NilClass(NoMethodError)
那么,这是否意味着我不能像那样使用哈希?或者你认为这个错误可能是因为其他原因?

r3i60tvu

r3i60tvu1#

你不能像那样使用散列my_hash[first_key]就是nil,然后下一个索引操作失败,有可能创建一个hash对象,它的行为符合您的要求--参见http://t-a-w.blogspot.co.uk/2006/07/autovivification-in-ruby.html--但不清楚这是不是一种好的风格。

ruyhziif

ruyhziif2#

你可以这样做

class NilClass

  def [] key
    nil
  end

end

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

p5cysglq

p5cysglq3#

默认情况下,散列是不嵌套的,因为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
jm2pwxwz

jm2pwxwz4#

你使用散列的方式在Ruby中是无效的,因为在进入嵌套散列之前,必须先将每个值赋给散列(我猜你是从PHP来的?),但是你可以使用生动的散列:

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

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

相关问题