Ruby: ループには一時変数ではなくEnumerableを使おう(翻訳)

概要

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

Ruby: ループには一時変数ではなくEnumerableを使おう(翻訳)

Rubyで私の大好きな機能のいくつかはEnumerableモジュールにあります。このモジュールについて詳しくはRubyのドキュメントをどうぞ。

ArraySetHashなどのような「コレクション」を表現するクラスでは、Enumerableのメソッドや機能が使えます。これらのメソッドを用いることで、そのグループをループで回して、コレクションの個別のメンバーを入力とする操作を行えます。

次のようには書かないこと

C言語のように一時変数を用いてループする。多くの言語ではこれでよしとされている。

total = 0
[1, 3, 5, 7].each do |num|
  total += num
end
total

次のように書くこと

RubyのEnumerableメソッド群への愛を存分に発揮して、#injectで実装する。

[1, 3, 5, 7].inject(0) do |total, number|
  total += number
end

次のように書けばさらに良い

Enumerableにある便利な#sumメソッドを用いる。

[1, 3, 5, 7].sum

そうすべき理由

私はRubyを使えば使うほど、Enumerableのメソッド群を実にエレガントな方法で利用できることに至高の喜びを感じます。このようにコードを構成することでRubyらしい書き方(idiomatic Ruby)になります。Rubyらしく書くことで、Rubyの作法に適った健全なRubyコードを書いていると言えるようになります。

巨大なループを扱う場合、Ruby組み込みのEnumerableメソッド群を用いることで、メモリ使用量の削減や速度の向上に著しい効果がもたらされることがよくあります。

ループの冒頭でこの手の「一時変数のセットアップ」を見かけたら、そのループをEnumerableのメソッドで適切に表現する絶好のチャンスと言えるでしょう。

そうすべきではない理由があるとすれば

Ruby経験の浅い人は、#injectなどのメソッドで混乱することもあるようです。こうしたメソッドはRubyを使って得られる基本的なメリットなので、ぜひモノにしましょう。

はてブより

Ruby: ループには一時変数ではなくEnumerableを使おう(翻訳)

原文からしてそうだけど、#injectの例はちょっと適切じゃないかな。公式ドキュメントで挙がってる「total + number」の方が良い。ブロックの返り値が次のループのtotalになるので。

2018/06/14 11:49

関連記事

Ruby: 自分のクラスに`#to_a`を実装すべきじゃない(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

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

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ