0

selectで作成されたハッシュからしようとすると、奇妙な動作が発生しgroup_byます:

私が走るとき

all_records.group_by(&:opportunity).map{|foo| foo[1].length != 1 }.select{|x| x}

私はいくつかの要素を取り戻します:=> [true, true]

しかし、私が選択しようとすると、正確なブロックで次のようになりますmap

all_records.group_by(&:opportunity).select{|foo| foo[1].length != 1 }

結果が得られません:=> {}

健全性チェックと同じように、最初にハッシュを次の配列に変換すると、期待どおりに機能しsortます。

all_records.group_by(&:opportunity).sort.select{|foo| foo[1].length != 1 }.length

結果:=> 2

最初の結果は、ハッシュがfoo[1]コマンドを完全に認識したことを示しているので、私には奇妙です。これは何が原因ですか?

4

1 に答える 1

2

最初のスニペットEnumerable#mapでは、単一の引数を取得するブロックを使用してハッシュで実行しており(なぜそれを解凍しませんか?)、ここでペアを取得します(予想どおり)。2番目のスニペットではHash#select、単一の引数を使用して再度実行しています(ここでも、キー/値を解凍する必要があります)が、ここでは、ペアではなくキーのみを取得します(メソッドの実装方法のため、ソースコードを確認してください詳細)。

>> {a: 1, b: 2}.map { |x| p x }
[:a, 1]
[:b, 2]
>> {a: 1, b: 2}.select { |x| p x }
:a
:b

Hash#selectのドキュメントにアクセスすると、解凍された引数が明示的に必要であることがわかります。結論:任意の方法でハッシュを繰り返すときは、常にキー/値を解凍します。

records.group_by(&:opportunity).select { |key, values| values.length > 1 }
于 2012-08-31T16:19:22.157 に答える