3

ハッシュのハッシュのハッシュを取得するにはどうすればよいですか?

テストが返ってきました

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

任意のヒント?

found = Hash.new()
x = 1;

while x < 4 do
  found[x] = Hash.new()
  y = 1

  while y < 4 do
    found[x][y] = Hash.new()
    found[x][y]['name1'] = 'abc1'
    found[x][y]['name2'] = 'abc2'
    found[x][y]['name3'] = 'abc3'

    y += 1
  end

  x += 1
end

found.each do |k, v, y|
  puts "k : #{k}"
  puts "  : #{v[y['name1']]}"
  puts "  : #{v[y['name2']]}"
  puts "  : #{v[y['name3']]}"
  puts
end
4

2 に答える 2

2

ハッシュを作成する方法は機能しているようです。おそらくエラーの原因は次のループです。

found.each do |k, v, y|

Hash#eachはキーと値のペアを生成するため、y割り当てられるためnil、2 行下のエラーが発生します。おそらくあなたが意味したのは、次のようなネストされたループです

found.each do |x, h1|
  h1.each do |y, h2|
    puts h2['name1']
  end
end

Ruby では、これらの種類のカウント ループをより簡潔に記述できることにも注意してください。

found = Hash.new { |h,k| h[k] = {} }

1.upto(3) do |x|
  1.upto(3) do |y|
    found[x][y] = {
      'name1' => 'abc1',
      'name2' => 'abc2',
      'name3' => 'abc3',
    }
  end
end
于 2012-03-21T17:12:17.230 に答える
2

私はあなたがこのようなものが欲しいと思います:

まず、データ構造を作成します。ネストされたハッシュが必要なため、各ハッシュ キーのデフォルト値を定義する必要があります。

found = Hash.new do |hash,key| 
    hash[key] = Hash.new do |hash,key|
        hash[key] = Hash.new
    end
end

検索を実行する

(1..3).each do |x|
  (1..3).each do |y|
    found[x][y]['name1'] = 'abc1'
    found[x][y]['name2'] = 'abc1'
    found[x][y]['name3'] = 'abc1'    
  end
end

次に、結果を表示します

found.each do |x, y_hash|
  y_hash.each do |y, name_hash|
    name_hash.each do |name, value|
      puts "#{x} => #{y} => #{name} => #{value}"
    end
  end
end
于 2012-03-21T17:16:17.137 に答える