- Ruby / Rails関連
READ MORE
原著者の許諾を得て翻訳・公開いたします。
idiosyncratic-ruby.comより
1993年にRubyが誕生して以来、長い月日が流れています。好ましいコーディングスタイルも大きく変わり、定まったベストプラクティスも生まれました(とはいうものの帯に短し襷に長しなのは世の常です)。それと同時に、Rubyのツールサポートはずいぶん向上したものの、言語はまだまだ複雑すぎます。おそらく、Rubyの機能を少しばかり間引く時が来たのでしょう。
機能の間引きは、既存コードが動かなくなる1というつらみを伴わないわけにはいきませんが、それでもやる価値はあります。
for
ループは避けるべし」といったベストプラクティスを後から学ばなくてよくなるコードに甚だしい非互換性をもたらさずに間引けそうな(そう願っています)Rubyの機能を、一部に独断を含みつつ以下にリストアップしました。
for
キーワードとin
キーワードfor
ループはめったに使われることがなく、Array#eachやInteger#timesといった意味論上ほぼ同等の機能の方が遥かに多用されています。しかも、for
はeach
を直接使うよりもわずかに遅いのです。『The Evils of the For Loop(for
ループは邪悪)』もご覧ください。
?
で始まる1文字リテラル?
を使うと1文字だけの文字列を引用符なしで書けます。Ruby 1.8とRuby 1.9のどちらでも動くコードを書くときにとても有用でした。
"Idiosyncratic"[0] == ?I
Ruby 1.9以降では右辺と左辺はどちらも"I"
が返り、Ruby 1.8では右辺と左辺はどちらも73
になるので、結果はどちらのバージョンでも一貫してtrue
になります。Ruby 1.8のサポートは2013年で終了したので、?
構文をサポートするメリットはもはやありません。
@@
によるクラス階層の変数クラス変数は使うもんじゃありません。ほぼすべての初心者が混乱するので、言語から削除すべきです。代替手段をいくつかリストアップします。
公平のため申し添えますと、クラス変数の削除は本記事の他の項目よりも広範囲に渡ってコードが動かなくなるかもしれません。単に削除するには大きすぎるやつです。
then
キーワード改行や;
によって条件を他の文と区切る場合は次のようになります。
if true
p 42
else
p 43
end
ただし、then
キーワードを使うこともできます。
if true then
p 42
else
p 43
end
then
を使う意味は2とおり考えられます。1つはワンライナーです。
if true then p 42 else p 43 end
しかし三項演算子(?
と:
)の方が見栄えは上です。
p true ? 42 : 43
もう1つはwhen
を1行で書く場合です。
case
when true then 42
when false then 43
end
しかしthen
を使わなくとも、;
で同じように1行で書けます。
case
when true; 42
when false; 43
end
つまるところ、then
は余分です。
TRUE
/FALSE
/NIL
定数true
、false
、nil
はいずれもキーワードですが、これらに対応する定義済みの定数があり、しかもその気になればTRUE, FALSE, NIL = nil, true, false
のような再定義もできてしまいます。これらの定数を今後も使う理由がありません。
最後にマッチした正規表現の結果にアクセスするうえで、わざわざ=~
でローカル変数を作成する必要はありませんし、=~
の右辺と左辺を入れ替えることもできません。やはり明示的に$~[:group_name]
でアクセスする方がずっと簡潔です。
and
/or
/not
キーワード優先順位の低いこれらの論理演算子は、たまに有用なこともあります。たとえば、代入される値がnil
の場合に例外を発生させたい場合に次のようにor
を使えます。
a = dangerous_operation or raise "dangerous operation failed"
しかし、これらのキーワードをRubyに今後も残す理由として十分でしょうか?既に多くのRuby初学者がこれらのキーワードで混乱しています。
-s
と-x
皆さんが最後に$ ruby -s
や$ ruby -x
を実行したのはいつだか覚えていますか?
意味論上、シンボルとfrozenの文字列は極めて近い間柄です。シンボルは文字列のショートハンドにすべきです。
本ブログではRubyの知られざる機能をたくさん紹介してきましたが、Rubyのフリップフロップについての記事はさすがにありません。
訳注: 上のリンクをクリックするとわかるように、英語圏では一般にflip-flopというと真っ先にビーチサンダルを連想します。
10.のフリップフロップは今後なくなりそうな塩梅です。
今日はなんとなく気が向いたので、flip-flop を葬るという意に沿わない仕事をしました。悲しい……。https://t.co/N34XQSay9u
— Yusuke Endoh (@mametter) June 15, 2018
まだ deprecated 段階なんで、反対は間に合いますよ
— Yusuke Endoh (@mametter) June 15, 2018
matz が消したいと言ったので消してみた
— Yusuke Endoh (@mametter) June 15, 2018
参考: Rubyのフリップフロップ - monamonamonad.github.io