来自编程 Ruby:
计数 枚举.count {| 对象 | 块 } → int
返回枚举中等于 obj 或块返回真值的对象的计数。
因此,枚举器访问每个元素并在块返回 true 时将计数加 1,这在这种情况下意味着元素是否等于数组索引。
我还没有看到这种模式被大量使用(如果有的话)——我更倾向于:
[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
通过“喷溅”的块参数来获取它们的值:
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 }
这对我来说似乎比原来的例子更清楚。