#each_with_object và #inject cả hai có thể được sử dụng để tạo băm.Tại sao #each_with_object và #inject chuyển thứ tự tham số khối?
Ví dụ:
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"]}
Một trong những khác biệt chính giữa hai là #each_with_object
theo dõi memo
qua toàn bộ lặp trong khi #inject
bộ memo
bằng giá trị được trả về bởi các khối trên mỗi lần lặp.
Sự khác biệt khác là thứ tự hoặc tham số khối.
Có một số ý định được truyền đạt ở đây không? Nó không có ý nghĩa để đảo ngược các tham số khối của hai phương pháp tương tự.
Tài khoản tốt và thú vị. Tôi hy vọng cũng có một mong muốn nhất quán với [Enumerator # with_object] (http://ruby-doc.org/core-2.3.0/Enumerator.html#method-i-with_object). Ví dụ. 'arr.each_with_index.with_object ({}) {| (e, i), h | ...'. Có các biến khối '| h, (e, i) |' sẽ vô cùng khó hiểu. –
Tính nhất quán (trong vị trí của các biến khối) với [Enumerable # each_with_index] (http://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-each_with_index) và [Enumerator # each_index] (http://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-each_with_index) cũng có thể là một yếu tố. –
"thứ tự của đối số phản ánh thứ tự từ vựng của tên phương thức, đó là' mỗi ... đối tượng'. "........... Tôi luôn quên thứ tự, bây giờ tôi sẽ không bao giờ. –