こんな記事を見た:
Rubyではelse ifではなくelsifを使う!その理由と注意点について | ポテパンスタイル
プログラミングスクールがマーケティングのために公開している多数の技術記事の一つのようだ。
Ruby では「ぶら下がり else 問題」があるので気をつけろ,ということらしい。
ぶら下がり else 問題とは
以下のようなコードがあったとする。言語は,まあ C とかを念頭に。
if (cond1)
if (cond2)
sentence1;
else
sentense2;
これは
if (cond1) {
if (cond2)
sentence1;
else
sentense2;
}
と解釈されるのか,それとも
if (cond1) {
if (cond2)
sentence1;
} else
sentense2;
と解釈されるのか。
else がどっちの if に付いているのか分からない。
もちろん,どっちに解釈されるかは言語仕様として決まっているわけだが,そこをしっかり把握していないとプログラマーの意図と違う解釈になりうる。
こういうのを「ぶら下がり else 問題」という。
この問題は,C, Pascal, Java, JavaScript, Perl, PHP などで起こる。
対策としては「{ } を略さず書きましょう」となる(Pascal だと begin/end を略さず書きましょう)。
Rust などでは { } が if の構文の一部となっていて(つまり書かずには済ませられない),ぶら下がり else 問題は起こり得ない。
現代的な言語はこういう問題が起こらないように設計されている。
われらが Ruby では
くだんの記事にこう書かれている。
「ぶら下がりelse問題」をご存じでしょうか。C言語やJavaなどのプログラミング言語を学んだ方は、if構文を{}で囲うので、入れ子になったif文が記述できます。しかし、Rubyには{}が無いので、2つ目以降の条件か、それとも、入れ子の条件かを明確に区別しなければなりません。
ええっ? ちょっと文意がよく分からないけど,どうも
- C, Java などでは入れ子の
ifも問題ない - Ruby では書き方に気をつけろ
と言っているような気がする。
別の箇所には
これは、Rubyにおける「ぶら下がりelse問題」、または、「ダングリングelse」と呼ばれています。
とか
Rubyのif構文では、「ぶら下がりelse問題」があるので
と書かれている。
Ruby にはぶら下がり else 問題があったのだ!
いや,無いよ。
Ruby では,if 式は
if cond
honyarara
end
のように必ず end で終わる。
なので
if cond1
if cond2
sentence1
else # ← 入れ子の内側の if に対応
sentense2
end
end
か
if cond1
if cond2
sentence1
end
else # ← 入れ子の外側の if に対応
sentense2
end
と書き分けることになり,「見た目があいまいな else」を書くことが原理的にできない。
if が end で終わるという文法によってぶら下がり else 問題を解決した言語として 1974 年の CLU が挙げられる。半世紀前には解決済みのはずだったのだが……。
感想
どうしてあのような記事が書かれたのだろう。
一般論として,誤った記事を書かないことはなかなか難しく,私も数々の誤りを書いてきてしまっている。他者の記事を批判する資格はない。
ただ,プログラミングスクールがマーケティング目的でやっているなら,やはりある程度の品質は確保しないとスクールの質自体が疑われるのではないだろうか。
同じサイトの Ruby の記事を二、三見てみたところ,ここまでおかしいものは無かったけれど,== を = と書いてしまって意図と違う動作になっているコードや,コードブロックの改行が全て失われて 1 行になっているものなどがあった。
後者の問題は,Ruby を知らなくてもパッと見れば何かがおかしいと気づきそうなので,そもそも校正を全くしていないのかもしれない
以前,別のプログラミングスクールで,やはり技術記事の品質をめぐって炎上した事件があった。
そこ以外のプログラミングスクールでも内容に問題のある記事を多数出しているところが少なくない気がする。
それらの記事は初心者向けで,初心者が誤って理解したり,無駄な時間を費やしたりしてしまうのを危惧する。どうにかならないものだろうか。