tryプログラミング、リモートワーク、田舎暮らし、音楽、etc.2013-02-28なぜRubyのcase/whenはインデントしないのかを考えてみたRubyはじめに昨日はソニックガーデンにしては珍しく、ちょっとしたコーディングスタイル論争(?)が発生しました。議論のネタになったのはRubyのcase文のインデントについてです。when節はインデントすべきか、それともcaseキーワードと揃えるべきかの議論になりました。other"endRubyのコーディング規約をいくつか見てみると、後者のインデントしないスタイルの方が多数派だったので、「インデントなしでいいじゃん」で結論付ければいいだけかもしれません。そもそも「なんでインデントしないのさ?インデントすると何か不都合があるの?」というところがハッキリしないと、全員が納得しないと思います。いうわけで、もうちょっと理由を掘り下げてみることにしました。C言語系のswitch/case文の場合Java/C#/JavaScriptなど、C言語の構文に影響を受けている言語だとswitch文のcaseキーワードはインデントさせることが多いようです。other");}こういう言語での開発経験がバックグランドにあると、インデントしないwhenに特に違和感を覚えるかもしれません。Rubyでもインデントさせた方が視覚的にcase文の始まりと終わりを認識しやすいというメリットがあるようにも思えます。other"endif/elsifと合わせるため?もしかするとRubyではあえてインデントしない特別な理由があるのだろうかと思い、国内外のサイトを色々と調べてみました。ネットで見かけた理由の一つは「case/whenとif/elsifは同じように使えるから、同じようなインデントにする」というものでした(参考)。other"endでもまあ、この説明で腑に落ちるのか?って考えると、まだどうもしっくり来ません。調べても考えてもよくわからない他のサイトも色々見て回りましたが、これ!という確固たる理由は見当たりませんでした。そこで自分なりに色々と理由を付けてみようとしましたが、結局これという理由は出てきませんでした。end」というように、出だしのキーワードが必ず2つ出てくるのがややこしくなる原因なのかな、という気がします。end」みたいに、出だしのキーワードが一つで済むなら、インデントの考え方もハッキリすると思うんですけどね。あと、Rubyのcase文はC言語系のswitch文とは別物(参考)なので、switch/case文の作法と照らし合わせて考えること自体がそもそもの間違いなのかもしれません。インデントには厳しいPythonだと・・・ところで、この問題を考えているときに「そうだ、インデントを文法的に強制するPythonはどう考えてるんだろう?」と思い、Pythonの構文をしらべてみました。Language」を見てみました。するとそこにはswitchとcaseが揃っているサンプルコードが載っていました。0;}元祖C言語ではインデントしないんでしょうか?Rubyのソースコードでは・・・じゃあ、Rubyのソースコードもインデントが揃っているのか?と思い、GitHubのコードを見てみました。適当にarray.cというコードを開いてみたのですが、ここではcaseがインデントされていました。NUM2LONG(arg));}一方、mrubyのarray.cはswitchとcaseのインデントが揃っていました。*/}なんだろう、同じRubyでも実装によってコーディングスタイルが異なるのでしょうか・・・?まとめ(まとまらない)というわけで調べれば調べるほど、だんだん訳がわからなくなってきました。case/whenにせよ、switch/caseにせよ、「これが筋の通ったあるべきコーディングスタイルだ!」というものは存在せず、言語の慣習やプログラマの好みによって、インデントする、しないが変わってくるだけなのかもしれません。追記)Matz先生に回答をもらいました!Eiffelの影響を受けていると言うことです。