Rubyでif文やwhile文とか言っている入門は非推奨

  • 12
    いいね
  • 7
    コメント

今日は言葉狩りを行いたいと思います。

Rubyではifもwihleも式である

生粋のRubyistである皆さんにとっては当たり前のことではありますが、Rubyではifwhile式(expression)です。決して文(statement)ではありません。これはCなど他のプログラミング言語にはないRubyの特徴の一つであり1、この違いは小さいようで大きいです。初心者のうちから、この違いを意識しておく必要があります。

プログラミング初心者にとって式と文の違いなんてどうでもいいのではという暴論もあるかも知れませんが、初心者だからこそ、式と文を意識させるべきです。式と文の違いがわからなければ、プログラミングの構造を理解することは永遠に来ないと思われるからです。

if文、while文という表現はおかしい

ifwhileも式ですから、if式、while式という表現はあっても、if文、while文という表現はおかしくなります。if式が何かの式の一部で無ければ全体が文になるとはいっても、if式はどこまで行っても式であり、その外側に式が無いから、文になっているにすぎません。むしろ、強調すべきは、その部分は式ですので、代入式の右辺やメソッド呼び出しの引数にできると言うことです。

しかし、Rubyの入門を名乗るサイトや書籍等において、if文、while文という表現が見受けられます。これを見た初心者は、そのままそれを信じ、Qiitaの記事においてif文、while文という表現を使ってしまっているものも見受けられます。これは由々しき事態です。式と文の違いが曖昧なまま学んでしまえば、式特有の書き方に出会ったときに戸惑う結果になるでしょう。他言語に移ったときも、文であることによる制限が理解できなくなる可能性もあります。

Rubyでif文やwhile文と言っているものは駆逐すべし

ということで、私はこの度、このような正確な表現ができていない入門サイトや書籍について、Rubyについての知識が足りない人が書いた不正確な情報と断定し、そのような入門サイトや書籍は読んだり、参考にしたりすることを推奨しないことにします。上級者であれば、マサカリを投げる訓練所としての価値はあるかも知れませんが、初心者にとっては害悪以外の何ものでもありません。

推奨入門サイト

if文やwhile文と表現しているサイトを取り上げます。本当は式であることを記述の上、あえてそのような表現を使っている場合は除外します。また、他では一貫して「if」や「if式」て書いてあるのに一つや二つだけ「if文」と書いてしまっている場合も、誤字であると判断し、除外します。改版等で修正された場合は、お知らせください。

「Ruby 入門」でググって引っかかる日本語のサイトを対象にしています。入門サイト紹介のページについては、紹介されたサイトを取り上げています。書籍等は購入しないと中身の確認が難しいため除外しています。なお、動画等の講座については、目次等でどのように表現しているかで判断しています。その内容を全て見ていませんので、目次に反して、文ではなく式として説明されていたというのであれば、お知らせください。

上記サイトの中には、もしかしたら、わかりやすい、よくできている、入門用に勧められたというサイトもあるかもしれません。しかし、if文、while文と表記している段階で、制作者がRubyについてよくわかっていない可能性が非常に高く、全体的に信頼できる内容とは言えません。私はこれらのサイトを非推奨とし、初心者が読んだり、参考にしたりすることを一切勧めません。

【おまけ】もう一つの判断基準、それはfor

Rubyにはforがありますが、eachを使用した場合とほぼ同じ動作になります。ほとんどの場合forは不要でありeachを使うべきとされています2。このforeachの関係性についてあまり説明していないサイトや書籍が見られます。forについてどのように説明しているのか、eachとどう違うのか、どちらを使うべきなのか、そういった所がどう書いてあるかはサイトや書籍の著者のレベルを判断する一つの基準になると思います。


  1. ifwhileが式である言語が他に無いわけではありません。Scala、Kotlin(ただしwhileは文)、CoffeeScript等があります。しかし、多くのCライクな文法の言語、C++、Java、C#、JavaScript、Perl、PHP等ではCと同じく文です。これらの言語では文末の;が省略できない(JavaScriptを除く)ため、単独の式が単独の文になることができないという事情があると思われます。ただ、Cライクでは無い、Python、Go(ただしwhileはない)、Swiftも文ですので、やはり、全て式とする言語は少数派と言えます。 

  2. RubyコミュニティでのデファクトスタンダードであるRuby Style Guideにおいては、使うべき理由を説明できる人以外はforを使うべきでは無いとされています。