2017-01-21 3 views
5

#each_with_objectおよび#injectの両方を使用してハッシュを構築できます。例えば#each_with_objectと#injectはブロックパラメータの順序を切り替えるのはなぜですか?

matrix = [['foo', 'bar'], ['cat', 'dog']] 

some_hash = matrix.inject({}) do |memo, arr| 
    memo[arr[0]] = arr 
    memo # no implicit conversion of String into Integer (TypeError) if commented out 
end 
p some_hash # {"foo"=>["foo", "bar"], "cat"=>["cat", "dog"]} 

another_hash = matrix.each_with_object({}) do |arr, memo| 
    memo[arr[0]] = arr 
end 
p another_hash # {"foo"=>["foo", "bar"], "cat"=>["cat", "dog"]} 

両者の主な違いの一つは、#injectセット反復ごとにブロックで返される値に等しいmemoながら全体を通して反復memoを追跡#each_with_objectあります。

もう1つの違いは、順序またはブロックパラメータです。

ここにはいくつかの意向がありますか? 2つの同様の方法のブロックパラメータを逆にすることは意味がありません。

答えて

4

彼らは異なる祖先を持っています。

  • each_with_object
  • inject 2007年のRuby 1.9に追加されている言語は、彼らがそうで引数を期待し始めるから、両方の方法を用いて設計した場合、私は推測1980

に戻っSmalltalkのに行きます同じ順序。しかし、これはそれが起こった方法ではありません。 injectはRubyの開始以来ずっと続きましたが、each_with_objectは10年後に追加されました。

injectは左倍にしSmalltalkのinject:into:

collection inject: 0 into: [ :memo :each | memo + each ] 

と同じ順序で引数を期待しています。このコレクションは、左から折りたたまれた長い紙片であると考えることができます。また、折り畳み機能のスライディングウィンドウは、常に折り畳まれた部分と残りの紙帯の次の要素を加算したものです。

# (memo = 0 and 1), 2, 3, 4 
# (memo = 1 and 2), 3, 4     
# (memo = 3 and 3), 4      
# (memo = 6 and 4)      

Smalltalkの規約に従えば、Enumerableのすべての初期メソッドはSmalltalkから取得され、MatzはSmalltalkをよく知っている人たちを混乱させたくないからです。

each_with_objectがRuby 1.9に導入され、引数の順序がメソッド名の字句順(each ... object)を反映している場合、2007年に起こることを先見することはできません。

したがって、これらの2つの方法は、歴史的な理由から、異なる順序で引数を期待しています。

+0

よろしくお願いします。私は、[Enumerator#with_object](http://ruby-doc.org/core-2.3.0/Enumerator.html#method-i-with_object)と一貫していることも期待しています。例えば。 'arr.each_with_index.with_object({}){|(e、i)、h | ...'。 '| h、(e、i)|'ブロック変数を持つことは非常に混乱していたでしょう。 –

+0

[Enumerable#each_with_index](http://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-each_with_index)と[列挙子#each_index](ブロック変数の配置における)の一貫性http://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-each_with_index)も要因となっている可能性があります。 –

+1

"引数の順序はメソッド名の字句順を反映しています。これは' each ... object'です。 "...............私は常に順序を忘れてしまいました。 –

関連する問題