著作一覧 |
あまりにもあほうなバグのために1~2時間ほど悩む。
最初、次のようなコードを書いていた。
class X def htov(a) #本当はjoinでは済まない程度に複雑 s = "**begin**\n" a.each {|e| s << "#{e}\n" } s << "**end**\n" end end
最初のと最後のマークを定数にしたほうが良いことに気づく(他のオブジェクトも利用するからだ)。
で、直す。
class X BEGIN_MARK = "**begin**\n" END_MARK = "**end**\n" def htov(a) s = BEGIN_MARK a.each {|e| s << "#{e}\n" } s << END_MARK end end
で、1回動かして問題ないことを確認したわけだが、あとから動かしていると異常なデータが作られまくる。
4文字追加して修正。
追記:Stringを定数として扱いたければ積極的に例外にさせるためにfreezeしたものに定数名をつけるのが良いだろう。BEGIN_MARK = '**begin**¥n'.freeze
ジェズイットを見習え |