私は昨年、 Ruby を用いて Web サービスを開発するという業務に少しだけ従事しました。
そこで初めて Ruby というプログラミング言語について基本的な事項を知ることになったのですが、これがどうも私にはしっくりこないものであったので、関係する事実とその感想等を述べたいと思います。
関数呼び出しの括弧を省略する記法がある
多くのプログラミング言語では、f という名の関数を呼び出すとき
f()
f(arg1)
f(arg1, arg2)
などとしますが、Ruby においてはリファレンスマニュアルの該当項目にある通り、括弧を省略した
f
f arg1
f arg1 arg2
のような記法が許されています。
x = a
などと記述されると、x に変数 a の値が代入されるのか、あるいは関数 a を呼び出した返り値が代入されるのか視覚的にわかりません。
これは、非常に混乱する記法であるからやめるべきだと思いました。
if 文と逆の役割をする構文がある
リファレンスマニュアルの該当項目にある通り、if 文と逆の役割をする unless 文があります。
unless error_detected
p "Hello, world!" # 正常時ここに到達する
end
私にはこの構文の必要性が理解できません。
if !error_detected
p "Hello, world!" # 正常時ここに到達する
end
ではいけないのでしょうか。
同義の組み込み関数が別名で複数ある
String::size(), String::length() などがこれに該当します。
混ぜて使うと混乱するため、どちらかだけで良いのではないでしょうか。
&&, || の式が真偽値以外を返す
JavaScript などにも似た仕様がありますが、リファレンスマニュアルの該当項目 には
&& 演算子について
左辺を評価し、結果が偽であった場合はその値(つまり nil か false) を返します。左辺の評価結果が真であった場合には右辺を評価しその結果を返します。
あるいは || 演算子について
左辺を評価し、結果が真であった場合にはその値を返します。左辺の評価結果が偽であった場合には右辺を評価しその評価結果を返します。
とあり
nil && false && 1 && 0 # nil
nil || false || 1 || 0 # 1
のようになります。
また、nil と false の評価は同じ偽であるのに
nil || false = nil
false || nil = false
となり、これも直感的に理解すると記述を誤る可能性がある記法であるからやめるべきだと思いました。
&&, ||, ! 演算子と and, or, not 演算子がある
and は同じ働きをする優先順位の低い演算子です。
あるいは
or は同じ働きをする優先順位の低い演算子です。
などとあります。なぜ同じ役割を持つ論理演算子が異なる優先順位で複数存在しているのかが理解できません。
not 演算子に至っては、! 演算子と全く同じです。
明らかに混ぜて使うと混乱するため、どちらかだけで良いのではないでしょうか。
独特な命名慣習
自らのオブジェクトや引数に取ったオブジェクトに破壊的な影響を及ぼすなど、「呼び出しに注意を要する」関数には f! などと末尾に感嘆符を付して命名するといものの、
「呼び出しに注意を要する」というのが具体的にどのような基準であるのか明文化されていません。
また、真偽値を返す関数には f? などと末尾に疑問符を付して命名するそうです。これは明解ではありますが、なぜ真偽値を返す関数だけ特別扱いなのでしょうか。
総括
以上に述べた点は、私の主観にはしっくりこないものでした。
そのような記法を忌避すれば良いのではないかという意見があるかと思いますが、どうも Ruby のプログラマは私が違和感を感じる記法であっても積極的に用いるようです。
ソフトウェアの開発は必ずしも一人で行うものではないため、私一人が特定の記法を忌避するというのは難しいです。