ソースコードの改行

Rubyでソースコードの可読性を高めるために1行のメソッドを複数行に改行する場合、ちょっと注意が必要です。

たとえば、like検索を行う条件文を生成するためのモジュールで下記のような記述をしてみました。

[sourcecode language="ruby"]

実行時にエラーとなる

@condition = (@condition.empty?)? " AND" : "" + " #{table_name}.#{col_name.to_s} LIKE " + ((match_pattern == MATCH_PATTERN_FULL) ? "%#{col_name.intern}" : "#{col_name.intern}%") [/sourcecode]

この場合、実行時に例外がスローされます。

[sourcecode language="bash"] NoMethodError: undefined method +@' for "%fuga_col_name":String lib/condition_util.rb:178:inadd_condition' test/unit/condition_util_test.rb:145:in `block in ' [/sourcecode]

原因は、Rubyリファレンスマニュアルに記載のあるとおりです。

プログラムはを並べたものです。式と式の間はセミコロ ン(;)または改行で区切ります。ただし、バックスラッシュに続く改行は文 の区切りにならず、次の行へ継続します。(Ruby リファレンスマニュアル

つまり、式と式はセミコロンまたは改行で区切るので、1行目が一つの式として判断され、2行目が ”+” から始まるメソッドとして認識されているのです。従って、この場合次のようにすることでエラーを回避することができます。

[sourcecode language="ruby"]

実行時にエラーとなる

@condition = (@condition.empty?)? " AND" : "" + " #{table_name}.#{col_name.to_s} LIKE " + ((match_pattern == MATCH_PATTERN_FULL) ? "%#{col_name.intern}" : "#{col_name.intern}%") [/sourcecode]

しれっと書いていることが結構重要だったりするので注意が必要ですね。この辺の話は本で読んだ記憶がない…。