從編程紅寶石:
計數enum.count {| obj |塊}→int
返回enum中等於obj或 塊返回true值的對象的計數。
因此,如果塊返回true,枚舉器訪問每個元素並將計數加1,在這種情況下,這意味着元素是否等於數組索引。
我還沒有看到大量使用(如果有的話)-I會更傾向於這種模式:
[4, 1, 2, 0].each_with_index.select { |elem, index| elem == index }.count
編輯
讓我們來看看從示例您的評論:
[4, 1, 2, 0].enum_for(:each_slice, 2).map do |a, b|
a + b
end
each_slice(2)
一次獲取數組2個元素並返回納秒每個切片的數組:
[4, 1, 2, 0].each_slice(2).map # => [[4,1], [2,0]]
該結果主叫map
讓我們每個子陣列上操作,它通入塊:
[4, 1, 2, 0].enum_for(:each_slice, 2).map do |a,b|
puts "#{a.inspect} #{b.inspect}"
end
導致
4 1
2 0
a
和b
憑藉「splatted」塊參數來獲取它們的值:
a, b = *[4, 1]
a # => 4
b # => 1
你也可以把陣列片作爲參數來代替:
[4, 1, 2, 0].enum_for(:each_slice, 2).map {|a| puts "#{a.inspect}"}
[4, 1]
[2, 0]
它可以讓你做到這一點:
[4, 1, 2, 0].enum_for(:each_slice, 2).map {|a| a.inject(:+) } #=> [5,2]
或者,如果你有的ActiveSupport(即一個Rails應用程序),
[4, 1, 2, 0].enum_for(:each_slice, 2).map {|a| a.sum }
這似乎比原來的例子更清晰。
實際上不是,block被執行4次,只是在irb中測試它 – Zed