RubyEnumerableモジュールを使いこなすことで、今まで書いてきたコードをより簡潔に書く事ができるかもしれない。Enumerableモジュールにはmapやselectなど強力なメソッドが含まれているが、ここではreduceメソッドについて説明する。15reduceメソッドのついて理解するためには以下の3つの理解が必要になる。・Enumerableオブジェクト→reduceメソッドのレシーバ。Enumerableモジュールをincludeしていないとreduceメソッドを呼び出すことができない。・ブロック→コレクションの各要素について1度ずつ実行される。eachメソッドのブロックと似ているが、reduceのブロックは戻り値を返す必要がある点で異なる。・叩き込み結果の初期値(アキュムレータ)→すべての要素がアキュムレータに畳み込まれると、その最終的な値がreduceの戻り値になる。以下のような実装を考えてみる。15reduceの引数の0はアキュムレータの初期値である。element)は次のブロックのアキュムレータに渡す、新しいアキュムレータを計算するために存在する。この例では、要素の値(element)を加算して、その結果を次のブロックのアキュムレータに渡している。reduceの戻り値となる。reduceは引数の省略が可能で、省略した場合は、コレクションの先頭の要素が初期値となり、第二要素からイテレーションを開始する動作とある。意図しない結果を招く可能性があるので、基本的には初期値を設定しておくのが好ましい。続いて以下のようなarrayオブジェクトをハッシュオブジェクトに変換する処理を考える。このような処理はreduceを使って以下のように書くことができる。このような処理はreduceを使って以下のように書くことができる。3=>true}初期値が空ハッシュ({})で、各ブロックの戻り値はハッシュ(mergeされた)を返すので最終的に求めるハッシュオブジェクトを得られる。最後の例はあるユーザの配列をフィルタリングして、未成年のユーザを取り除いた(20歳以上のユーザのみ残す)ユーザ名の一覧を求める処理を考えてみる。selectでusers配列を反復処理を実行した後にmapを使っているので、効率の観点だと以下のようにreduceを使ったほうが効率が良い。}.map(&:name)selectでusers配列を反復処理を実行した後にmapを使っているので、効率の観点だと以下のようにreduceを使ったほうが効率が良い。20namesendまとめ・reduceで書き換えられないか検討する・アキュムレータの初期値は基本的には設定しておいた方が良い・ブロックでは必ずアキュムレータを返すようにするスポンサーリンクスポンサーリンクスポンサーリンクシェアするツイートフォローするarakawa関連記事hashのデフォルト値を設定するとあるハッシュオブジェクトがあって、存在しないキーで値を取得しようとするとnilが返る。Ruby以外の言語をやっていると、Rubyの定数の振る舞いは特殊に感じるかもしれない。定数といえば、そ...記事を読むRubyのtrueとfalse論理型の扱いについてどのプログラミング言語でも多少の違いがある。nil:NilClassの対策NoMethodErrorはRubyでプログラムを書いていると、最もよく目にするエラーの一つだと思う。コメントをキャンセルメールアドレスが公開されることはありません。新宿で働くウェブエンジニアの技術ブロク.。