Ruby中each.with_index和each_with_index之间的区别?


93

我对each.with_index和之间的区别感到非常困惑each_with_index。它们具有不同的类型,但实际上似乎是相同的。


6
除了轻微的区别在于with_index允许起始索引偏移量,with_index在结合时,通常优选mapreducecollect等,总之,map.with_index读取优于each_with_index.map。从某种意义上说,当与一起使用时map,它是不存在的map_with_index方法的替代品。
卡里·斯沃夫兰

Answers:


170

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

41

each_with_index是较早引入Ruby的。with_index稍后介绍:

  1. 以便广泛用于各种枚举器。
  2. 允许索引从以外的数字开始0

如今,with_index从通用性和可读性的角度来看,使用会更好,但是从加快代码的角度来看,each_with_index运行速度比稍快each.with_index

当您认为可以通过直接链接几个方法来轻松表达单个方法时,通常情况是单个方法比链接要快。至于另一个示例,其reverse_each运行速度比快reverse.each。这些方法有理由存在。


1
公平地说,偏移量不会更改索引,它只是向索引添加一个数字。通话后检查索引时,您会发现它不受影响。与往常一样的好笔记,@ sawa
vgoff

2
我认为perf应该不会有所不同(至少没有实质性的不同)。在此reverse示例中,reverse返回的是另一个数组,而不是枚举器。如果它返回了一个枚举数,那么通过一个好的实现它不应该变慢。
akostadinov '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.