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」を付けて発言するとかでも良いと思います。メールの方が確実ですが)
もうお気づきかもしれませんが、評価順序の関係でopen(path, "w")が先に行われるため、ファイル内容がクリアされます。
どっちかというとわかりやすいバグというか。<br><br>むしろsaveがないのにsave!というメソッドがあるのが仕様バグっぽいですね!(とかいう
sort file > file ってやっちゃって「あっ!」みたいな。