我有这样一段代码:
my_hash = {} first_key = 1 second_key = 2 third_key = 3 my_hash[first_key][second_key][third_key] = 100
ruby解释器给了我一个错误未定义nil的方法“[]”:NilClass(NoMethodError)那么,这是否意味着我不能像那样使用哈希?或者你认为这个错误可能是因为其他原因?
r3i60tvu1#
你不能像那样使用散列my_hash[first_key]就是nil,然后下一个索引操作失败,有可能创建一个hash对象,它的行为符合您的要求--参见http://t-a-w.blogspot.co.uk/2006/07/autovivification-in-ruby.html--但不清楚这是不是一种好的风格。
my_hash[first_key]
ruyhziif2#
你可以这样做
class NilClass def [] key nil end end
在nil_overrides.rb这样的初始化器中,您将能够使用nil['xxx']。
nil_overrides.rb
nil['xxx']
p5cysglq3#
默认情况下,散列是不嵌套的,因为my_hash[first_key]没有设置任何值,所以它是nil,而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
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}}}
这是你可能会感到舒服的方式。
4条答案
按热度按时间r3i60tvu1#
你不能像那样使用散列
my_hash[first_key]
就是nil,然后下一个索引操作失败,有可能创建一个hash对象,它的行为符合您的要求--参见http://t-a-w.blogspot.co.uk/2006/07/autovivification-in-ruby.html--但不清楚这是不是一种好的风格。ruyhziif2#
你可以这样做
在
nil_overrides.rb
这样的初始化器中,您将能够使用nil['xxx']
。p5cysglq3#
默认情况下,散列是不嵌套的,因为
my_hash[first_key]
没有设置任何值,所以它是nil
,而nil
不是散列,所以尝试访问它的某个元素会失败。因此:
jm2pwxwz4#
你使用散列的方式在Ruby中是无效的,因为在进入嵌套散列之前,必须先将每个值赋给散列(我猜你是从PHP来的?),但是你可以使用生动的散列:
这是你可能会感到舒服的方式。