9

私はこのようなコードを持っています:

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

そして、ルビー通訳は私にエラーを与えました:

nil:NilClassの未定義メソッド `[]'(NoMethodError)

それで、そのようなハッシュを使用できないということですか?または、このエラーは他の原因である可能性があると思いますか?

4

4 に答える 4

12

ハッシュはデフォルトではネストされていません。my_hash[first_key]何も設定されていないのでnilです。またnil、ハッシュではないため、その要素の1つにアクセスしようとすると失敗します。

それで:

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
于 2012-05-01T01:46:10.497 に答える
8

ネストされたハッシュに移動する前に、すべての値を最初にハッシュに割り当てる必要があるため、ハッシュの使用方法はRubyでは無効です(PHPからのものだと思いますか?)が、vivifiedハッシュを使用できます。

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

これはあなたが快適かもしれない方法です。

于 2012-05-01T03:21:33.457 に答える
2

そのようなハッシュは使用できません。my_hash[first_key]はnilであり、次のインデックス作成操作は失敗します。探している方法で動作するハッシュオブジェクトを作成することは可能です-http://taw.blogspot.co.uk/2006/07/autovivification-in-ruby.htmlを参照してください-しかし、それは明確ではありませんこれは良いスタイルです。

于 2012-05-01T01:47:02.787 に答える
0

あなたは次のようなことをすることができます

class NilClass

  def [] key
    nil
  end

end

のような初期化子で、nil_overrides.rbを使用できるようになりますnil['xxx']

于 2014-05-19T00:05:00.557 に答える