在 Ruby 中 each_with_index 和 each_with_index 之间的区别是什么?

我对 each.with_indexeach_with_index之间的区别感到非常困惑。他们有不同的类型,但在实践中似乎是相同的。

92200 次浏览

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 was introduced into Ruby earlier. with_index was introduced later:

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

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

当您觉得单个方法可以通过简单地链接几个方法来轻松地表示时,通常情况下,单个方法比链接快。至于这方面的另一个例子,reverse_each运行速度比 reverse.each快。这些方法有存在的理由。