Answers:
该with_index
方法采用一个可选参数来偏移起始索引。each_with_index
做同样的事情,但是没有可选的起始索引。
例如:
[:foo, :bar, :baz].each.with_index(2) do |value, index|
puts "#{index}: #{value}"
end
[:foo, :bar, :baz].each_with_index do |value, index|
puts "#{index}: #{value}"
end
输出:
2: foo
3: bar
4: baz
0: foo
1: bar
2: baz
each_with_index
是较早引入Ruby的。with_index
稍后介绍:
0
。如今,with_index
从通用性和可读性的角度来看,使用会更好,但是从加快代码的角度来看,each_with_index
运行速度比稍快each.with_index
。
当您认为可以通过直接链接几个方法来轻松表达单个方法时,通常情况是单个方法比链接要快。至于另一个示例,其reverse_each
运行速度比快reverse.each
。这些方法有理由存在。
reverse
示例中,reverse
返回的是另一个数组,而不是枚举器。如果它返回了一个枚举数,那么通过一个好的实现它不应该变慢。
with_index
允许起始索引偏移量,with_index
在结合时,通常优选map
,reduce
,collect
等,总之,map.with_index
读取优于each_with_index.map
。从某种意义上说,当与一起使用时map
,它是不存在的map_with_index
方法的替代品。