Ruby が PHP に負けている点 #2: 複文の終わりを表す予約語が end しかない

負けているというと言い過ぎだけど、Ruby では複文の終わりを表すのが end しかない。
しかし PHP では、あまり知られてなさそうだけど endif や endwhile や endforeach が使える。

<?php $table = array(10, 20, NULL, 40, NULL); ?>
<table>
  <tbody>
<?php $total = 0; ?>
<?php foreach ($table as $key => $value): ?>
<?php   if ($value): ?>
    <tr>
      <td><?php echo $key ?></td>
      <td><?php echo htmlspecialchars($value) ?></td>
    </tr>
<?php     $total += $value; ?>
<?php   endif ?>
<?php endforeach ?>
  </tbody>
</table>
<p>total: <?php echo $total ?></p>

Ruby では end しかないから、if 文や for 文がネストしたときに end を書き忘れたりタイプミスしたりすると、どこを間違えたのか探し出すのが非常に困難である。エディタの自動インデントに任せれば見つかるというやつもいるけど、Ruby の文法は正しく解析するのが非常に困難で、Emacsruby-mode ですらよくインデントを間違うから、あてにならん。

また 9 割がたはエディタの自動インデントで検出できるのはその通りなんだが、エディタでは検出できない残りの 1 割が実際には大きな問題である。なにせ、発生したときに間違った箇所を発見するのが困難なため、1 割しか発生しなくても大きな作業コストとなるのだ。正直、エディタで見つかるから問題ないと主張しているやつは、問題を正面から取り組むことから逃げているだけだと思う。

1 ファイルに長く書きすぎるのが悪い、コードを細かくファイルに分割してメソッド定義も短くするよう心がければ、end の間違いは発見しやすいという人もいる。しかし eRuby をしょっちゅう使っている身からすると、eRuby ではその方法は使えない。また eRuby では <% for item in @list %> と <% end %> の間が数十行になるのは珍しいことではないから、こんな方法もあるとはいえ、end の問題はふつうの Ruby コードよりも深刻だ。

そう考えると、PHP で endif や endforeach が使えるというのは実にうらやましい。これだと書き間違えた場合でも、間違った箇所が特定しやすい。しかも PHP では '{ }' も使えるから、ふだんは '{ }' で書いておき、問題があった場合は endif や endforeach に書き換えて間違った箇所を探す、ということができる。

Ruby でも、endif や endfor や enddef が予約語にならないだろうか。もし予約語になってくれれば、Ruby の end 問題はおおかた解決すると思う。普段は end だけを使っておき、問題があれば endif や endfor を使って問題箇所を特定する。endif や endfor を変数名やメソッド名にするとは思えないので、互換性にはほとんど影響ないはずだ。


・・・でまあ、こんなことをいちいち考えなくて済む Python が最強ということで (えー?)。