概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: 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
