概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Idiosyncratic Ruby: Less Feature-Rich, More Fun
- 原文公開日: 2017/12/25
- 著者: Jan Lelis
- サイト: Idiosyncratic Ruby
idiosyncratic-ruby.comより
Ruby: これはなくてもいいかも?と思う10の機能(翻訳)
1993年にRubyが誕生して以来、長い月日が流れています。好ましいコーディングスタイルも大きく変わり、定まったベストプラクティスも生まれました(とはいうものの帯に短し襷に長しなのは世の常です)。それと同時に、Rubyのツールサポートはずいぶん向上したものの、言語はまだまだ複雑すぎます。おそらく、Rubyの機能を少しばかり間引く時が来たのでしょう。
機能の間引きは、既存コードが動かなくなる1というつらみを伴わないわけにはいきませんが、それでもやる価値はあります。
- Ruby初心者が最初から「正しい書き方」を学べる: 「
for
ループは避けるべし」といったベストプラクティスを後から学ばなくてよくなる - 言語がよりシンプルになる: すなわちツールのサポートも改善される!
コードに甚だしい非互換性をもたらさずに間引けそうな(そう願っています)Rubyの機能を、一部に独断を含みつつ以下にリストアップしました。
(多少の差はあれど)あまりがたつかずに削除できそうなRubyの10の機能
1. for
キーワードとin
キーワード
for
ループはめったに使われることがなく、Array#eachやInteger#timesといった意味論上ほぼ同等の機能の方が遥かに多用されています。しかも、for
はeach
を直接使うよりもわずかに遅いのです。『The Evils of the For Loop(for
ループは邪悪)』もご覧ください。
2. ?
で始まる1文字リテラル
?
を使うと1文字だけの文字列を引用符なしで書けます。Ruby 1.8とRuby 1.9のどちらでも動くコードを書くときにとても有用でした。
"Idiosyncratic"[0] == ?I
Ruby 1.9以降では右辺と左辺はどちらも"I"
が返り、Ruby 1.8では右辺と左辺はどちらも73
になるので、結果はどちらのバージョンでも一貫してtrue
になります。Ruby 1.8のサポートは2013年で終了したので、?
構文をサポートするメリットはもはやありません。
3. @@
によるクラス階層の変数
クラス変数は使うもんじゃありません。ほぼすべての初心者が混乱するので、言語から削除すべきです。代替手段をいくつかリストアップします。
- クラスインスタンス変数
- ActiveSupportのクラス属性
- Hanamiのクラス属性
公平のため申し添えますと、クラス変数の削除は本記事の他の項目よりも広範囲に渡ってコードが動かなくなるかもしれません。単に削除するには大きすぎるやつです。
4. 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
は余分です。
5. TRUE
/FALSE
/NIL
定数
true
、false
、nil
はいずれもキーワードですが、これらに対応する定義済みの定数があり、しかもその気になればTRUE, FALSE, NIL = nil, true, false
のような再定義もできてしまいます。これらの定数を今後も使う理由がありません。
6. 正規表現マッチングによる暗黙のローカル変数生成
最後にマッチした正規表現の結果にアクセスするうえで、わざわざ=~
でローカル変数を作成する必要はありませんし、=~
の右辺と左辺を入れ替えることもできません。やはり明示的に$~[:group_name]
でアクセスする方がずっと簡潔です。
7. and
/or
/not
キーワード
優先順位の低いこれらの論理演算子は、たまに有用なこともあります。たとえば、代入される値がnil
の場合に例外を発生させたい場合に次のようにor
を使えます。
a = dangerous_operation or raise "dangerous operation failed"
しかし、これらのキーワードをRubyに今後も残す理由として十分でしょうか?既に多くのRuby初学者がこれらのキーワードで混乱しています。
8. コマンドラインの謎オプション: -s
と-x
皆さんが最後に$ ruby -s
や$ ruby -x
を実行したのはいつだか覚えていますか?
9. シンボル
意味論上、シンボルとfrozenの文字列は極めて近い間柄です。シンボルは文字列のショートハンドにすべきです。
10. フリップフロップ
本ブログでは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