Ktouth Brand. on Web

け〜くんこと K.Ktouth のだらだらした日常と突発的に作るプログラムや読み物とかの雑多サイト



[2010年03月29日]

続:小一時間悩んだ

2010年03月29日 23:46更新 筆者:K.Ktouth

たのしいRuby 第3版(AA)

今日もアホなコードミスの話題(ぉぃ

hash.each do |k|
 unless k.is_a?(Symbol)
  if ary.nil? or ary.include?(k)
  hash[k] = funcs[k].call(hash[k]) if funcs[k]
 else
  hash.delete(k)
 end
end

hash、ary、funcs はそれぞれ適切な値の入ったハッシュなり配列だったりします。
このコードの悪いところはどこでしょう?

ちなみに正しく動作するように修正すると、こうなります。

hash.keys.each do |k|
 unless k.is_a?(Symbol)

(以降、上記引用と同じ)

はい、たったこれだけ。
C++等ではやっちゃいけない定番のミスですな。イテレータを動かしている際に元データを更新するという。そりゃ返す値がおかしくなったり同じキー値を返したりしますわ。
rubyだとイテレータという感覚じゃなくなってきたのですっかり忘れてました。今回は Hash#keys を使って開始時点でのキー値をコピーすることで回避しています。

こういう凡ミスばかりやっていると、もう一度学生からやり直したくなる…… orz

本日のリンク元
アンテナ
その他のリンク元
検索