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

标签 ruby loops for-loop each

Eloquent Ruby(第 21 页,第一版,第六次打印) 一书中,作者 (Russ Olsen) 提倡使用 each方法而不是 for 循环,这与我在其他地方读到的所有内容一致。

但是作者还继续说,这样做的一个原因是 for 循环实际上调用了 each 方法,所以为什么不直接删掉中间人并使用 each?所以我想知道这实际上是如何工作的。

为了调查,我确实在 github 上的 Ruby 存储库上进行了搜索,但发现很难确定我在哪里/如何看到它的实际效果。

重述问题:

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

最佳答案

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

# 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

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

collection = ThreeOf.new(99)

for i in collection
  puts i
end

运行它,您将看到打印出的消息,并且 for“循环”将循环三遍。

或者(更有趣)你可以猴子修补内置的 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

您将再次看到打印的消息。

关于ruby - 如何证明 Ruby `for` 循环实际上是使用 `each` 方法实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39839809/

相关文章:

c++ - 为什么 "for (i = 100; i <= 0; --i)"永远循环?

c - 使用 for 循环的模式

ruby - 我可以将 Heroku 项目指向我的域中的路径吗?

ruby-on-rails - Rails 3 : belongs_to, has_one 和迁移

python - 如何优化 (3*O(n**2)) + O(n) 算法?

ios - 循环遍历嵌套的 NSMutableDictionary 并过滤一些项目

ruby - 有没有限制/限制数字的方法?

mysql - Ruby 循环将事物添加到一起

javascript - 循环遍历对象以输出图标 javascript

c++ - C++中使用for循环时的同名变量