6

私はRubyの学習に取り組んでおり、injectに出くわしました。私はそれを理解しようとしていますが、私が何かを学ぶために実世界の例を必要とするタイプの人であるとき。私が遭遇する最も一般的な例は、(1..10)範囲の合計を合計するために注入を使用している人々ですが、これはあまり気にする必要はありません。これは恣意的な例です。

実際のプログラムで何に使用しますか?Railsに進むことができるように学習していますが、Web中心の例を用意する必要はありません。頭を包むことができる目的を持ったものが必要です。

皆さんありがとう。

4

5 に答える 5

7

inject「他の」名前であるreduce. これは、Enumerable(一度反復して)を操作し、単一の値を返す関数です。

特に. Enumerable_ map多くの場合、別の方法があるとしても、より簡潔で表現力豊かな方法になることがあります。

次のような例は、最初は役に立たないように思えるかもしれません。

range.inject {|sum, x| sum += x}

ただし、変数rangeは単純な明示的な範囲である必要はありません。これは、(たとえば) データベースから返された値のリストである可能性があります。ショッピング カート内の価格のリストを返すデータベース クエリを実行した場合、 を使用.injectしてそれらをすべて合計し、合計を取得できます。

単純なケースでは、SQL クエリ自体でこれを行うことができます。一部のアイテムに税金が追加され、一部のアイテムに追加されないなど、より困難なケースでは、次のようなものinjectがより役立ちます。

cart_total = prices.inject {|sum, x| sum += price_with_tax(x)}

この種のことは、オブジェクトがEnumerable単純な数値よりも詳細な処理を必要とする複雑なクラスである場合、または処理前に共通の型に変換する必要がある異なる型のオブジェクトが Enumerable に含まれている場合にも特に役立ちます。はブロックを受け取るためinject、必要に応じて機能を複雑にすることができます。

于 2012-08-20T23:46:33.920 に答える
0

範囲ではなく、eBay での商品の販売価格のリストがあり、平均価格を知りたいとします。+ を注入してから、長さで割ることでそれを行うことができます。

于 2012-08-20T23:42:15.963 に答える
0

ActiveRecord スコープは典型的なケースです。モデルを呼び出すscopedと、追加のスコープをチェーンできるオブジェクトが得られます。これにより、 inject を使用して、たとえば params ハッシュから検索範囲を構築できます。

search_params = params.slice("first_name","last_name","city","zip").
  reject {|k,v| v.blank?}

search_scope = search_params.inject(User.scoped) do |memo, (k,v)|
  case k
  when "first_name"
    memo.first_name(v)
  when "last_name"
    memo.last_name(v)
  when "city"
    memo.city(v)
  when "zip"
    memo.zip(v)
  else
    memo
  end

(注: パラメータが指定されていない場合、テーブル全体が返されますが、これは意図したものではない可能性があります。)

于 2012-08-21T02:03:39.507 に答える
0

inject または同義語の reduce についての私のお気に入りの説明は次のとおりです。

reduce は配列を受け取り、それを 1 つの値に減らします。これは、リストを反復処理し、途中で現在の合計を保持および変換することによって行われます。

http://railspikes.com/2008/8/11/understanding-map-and-reduceの素晴らしい記事で見つけました

于 2013-05-06T19:18:56.930 に答える