プロが教える店舗&オフィスのセキュリティ対策術

forループの中のハッシュをeachしたいのですが、
printすると、一番最後のループのハッシュだけ表示されるようです。
全部中身を出すにはどういうソースを書けばよいのでしょうか。

-----------------------
center = 7

for i in 5..13
if center < 9
ban = { "i" => center }
center += 1
else
ban = { "i" => center }
center = center % 9
center += 1
end
end

ban.each{|key, value|
print(key + "=>", value)
}

A 回答 (2件)

No.1 にて、mtaka2さんがおっしゃている通り、1要素のハッシュで上書きしていますので、結果は1要素になります。



なにをやりたいのかが、質問では分かりかねますが、
5から13までの文字列をキーにもつハッシュを作って表示したいのであれば、

center = 7
ban = { }

for i in 5..13
if center < 9
ban[i.to_s]= center
center += 1
else
ban[i.to_s]= center
center = center % 9
center += 1
end
end

ban.each{|key, value|
print(key , "=>", value , ",")
}

等でしょうか。
ハッシュでeachを使うと順序は保障されませんので、順序を気にするのであればmtaka2さんがおっしゃているように最初から配列をつかう方法が良いと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ハッシュの中のハッシュが分かりやすいです。

お礼日時:2011/02/15 22:48

ループの中で


> ban = { "i" => center }
という変数代入によってbanを「{"i => center}」すわなち1要素しかないハッシュという値で上書きしてすから、ループ終了後のbanの中身はは最後の代入結果だけになりますね。
banを「配列」にして追記してくようにすれば、
ループ終了後に追記内容を全て取り出せるようになります。

---ここから---
center = 7
ban = []

for i in 5..13
if center < 9
ban << {"i"=>center}
center += 1
else
ban << {"i"=>center}
center = center % 9
center += 1
end
end

ban.each{|banelement|
banelement.each{|key, value|
print(key,"=>", value,"\n")
}
}
---ここまで---
    • good
    • 0
この回答へのお礼

ありがとうございます。
でも配列にハッシュって取りだし方が複雑で・・・私にはキツイです。

お礼日時:2011/02/15 22:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!