トップ «前の日記(2010-02-09) 最新 次の日記(2010-02-18)» 編集

Route 477



2010-02-11

[ruby] わかりにくいバグ わかりました

以下のコード、どこがバグか分かるだろうか?

class Foo
  def initialize(path)
    @path = path
  end

  def src
    @src ||= File.read(@path)
  end

  def save!
    File.open(@path, "w"){|f| f.write modify(src)}
  end

  private
  def modify(s)
    s.gsub(/hello/, "Hello") # 例
  end
end
Foo.new("tmp.txt").save!

正解は「modifyに空文字列が渡る」でした。なんでこうなるんだろう?

(追記:コメント欄で指摘いただきましたが、File.openを呼んだ時点でファイルの内容がクリアされるからでした。 寝不足はデバッグの敵!)

[ruby][event] 「Rubyの作者だけど何か質問ある?」

1 名無しさん(西日本) 2010/02/10(水) 12:36:24.29 ID:ZA5dvn9p
特定されない範囲で

そりゃあ無理だ!

というわけで(は、勿論ないですが)今週末に行われる 松江Ruby会議02で、 「まつもとさんに聞いてみよう(仮)」というイベントが行われます。

Ruby開発者のまつもとさんに、Rubyを使っていて気になったことや、Rubyの実装に関する分からないことを質問してみましょう。当日、気軽に質問していただけるように配慮します。また、事前に質問内容を matsue02 _at_ rubykaigi.org に送っていただければ、当日、司会からまつもとさんに質問いたします。

[http://regional.rubykaigi.org/matsue02より引用]

質問の投稿はメールで受け付けています。 (あるいは、Twitterで「#matrk02」を付けて発言するとかでも良いと思います。メールの方が確実ですが)

本日のツッコミ(全3件) [ツッコミを入れる]
まつもと (2010-02-11 14:36)

もうお気づきかもしれませんが、評価順序の関係でopen(path, "w")が先に行われるため、ファイル内容がクリアされます。

なかむら(う) (2010-02-11 15:10)

どっちかというとわかりやすいバグというか。<br><br>むしろsaveがないのにsave!というメソッドがあるのが仕様バグっぽいですね!(とかいう

knu (2010-02-11 18:45)

sort file > file ってやっちゃって「あっ!」みたいな。