Ruby: これはなくてもいいかも?と思う10の機能(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。


idiosyncratic-ruby.comより

Ruby: これはなくてもいいかも?と思う10の機能(翻訳)

1993年にRubyが誕生して以来、長い月日が流れています。好ましいコーディングスタイルも大きく変わり、定まったベストプラクティスも生まれました(とはいうものの帯に短し襷に長しなのは世の常です)。それと同時に、Rubyのツールサポートはずいぶん向上したものの、言語はまだまだ複雑すぎます。おそらく、Rubyの機能を少しばかり間引く時が来たのでしょう。

機能の間引きは、既存コードが動かなくなる1というつらみを伴わないわけにはいきませんが、それでもやる価値はあります。

  • Ruby初心者が最初から「正しい書き方」を学べる: 「forループは避けるべし」といったベストプラクティスを後から学ばなくてよくなる
  • 言語がよりシンプルになる: すなわちツールのサポートも改善される!

コードに甚だしい非互換性をもたらさずに間引けそうな(そう願っています)Rubyの機能を、一部に独断を含みつつ以下にリストアップしました。

(多少の差はあれど)あまりがたつかずに削除できそうなRubyの10の機能

1. forキーワードとinキーワード

forループはめったに使われることがなく、Array#eachInteger#timesといった意味論上ほぼ同等の機能の方が遥かに多用されています。しかも、foreachを直接使うよりもわずかに遅いのです。『The Evils of the For Loopforループは邪悪)』もご覧ください。

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. @@によるクラス階層の変数

クラス変数は使うもんじゃありません。ほぼすべての初心者が混乱するので、言語から削除すべきです。代替手段をいくつかリストアップします。

公平のため申し添えますと、クラス変数の削除は本記事の他の項目よりも広範囲に渡ってコードが動かなくなるかもしれません。単に削除するには大きすぎるやつです。

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定数

truefalsenilはいずれもキーワードですが、これらに対応する定義済みの定数があり、しかもその気になれば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.のフリップフロップは今後なくなりそうな塩梅です。

参考: Rubyのフリップフロップ - monamonamonad.github.io

関連記事

【保存版】Rubyスタイルガイド(日本語・解説付き)総もくじ

[Ruby] Kernelの特殊変数をできるだけ$記号なしで書いてみる


  1. もしかするとですが、マジックコメントを用いたstrictモードやquarksモードを追加できるのかも知れません。余計ややこしくなるでしょうが。 
デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

夏のTechRachoフェア2019

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ