我如何证明Ruby`for`循环实际上是使用`each`方法实现的?

Sag*_*dya 5 ruby each loops for-loop

Eloquent Ruby(第21页,第一版,第六版)中,作者(Russ Olsen)主张使用该each方法而不是for循环,这与我在其他地方阅读的所有内容一致.

然而,作者还接着说,这样做的一个原因是for循环实际上调用了each方法,那么为什么不切断中间人并使用each呢?所以我想知道这实际上是如何工作的.

为了调查我确实搜索了github上的Ruby repo,但发现很难确定我在哪里/如何看到这个行动.

重申一下这个问题:

如何显示Ruby for循环实际上是使用该each方法实现的?

小智 12

您可以通过编写实现每个的类来显示它:

# Demo that for calls each

class ThreeOf
  def initialize(value)
    @value = value
  end

  def each(&block)
    puts "In Each"
    block.call(@value)
    block.call(@value)
    block.call(@value)
  end
end
Run Code Online (Sandbox Code Playgroud)

然后创建一个实例并在for循环中使用它:

collection = ThreeOf.new(99)

for i in collection
  puts i
end
Run Code Online (Sandbox Code Playgroud)

运行它,你会看到打印出来的消息,for"loop"将循环三次.

或者(更有趣)你可以修补内置的Array类:

class Array
  alias_method :orig_each, :each

  def each(*args, &block)
    puts "Array Each called!"
    orig_each(*args, &block)
  end
end

puts "For loop with array"
for i in [1,2,3]
  puts i
end
Run Code Online (Sandbox Code Playgroud)

再次,您将看到打印的消息.