1

我正在阅读 Programming with Ruby 2.0 并有一个问题

   def my_while(cond, &body)
     while cond.call
       body.call
     end
   end

   a=0

   my_while -> { a < 3 } do
     print a
     a += 1
   end #=> 0 1 2

我的问题是:为什么我们不能以这种方式使用该方法

    def my_while(cond, &block)
      while cond
       block.call
      end   
    end

    a = 0
    my_while (a<3) do
      print a
      a += 1
    end #=> infinite loop

实际上如何在条件 (a<3) 和块参数的情况下使用此函数?

PS我看到了这个问题,但仍然不能在那里发表评论!

4

1 回答 1

1

在最后一个代码示例中,在运行a<3线路调用时进行评估my_while

正如之前在行中a设置的那样,计算结果为真(0 小于 3)。这意味着在里面,被设置为。它继续存在,因为从未重新评估,即使已更改。因此循环不断循环。0a<3my_whilecondtruetruea<3awhile

使用 lambda 并.call在循环的每次迭代中对其进行 ing,确保a<3为每个循环评估条件,允许 while 循环在a<3不再评估为时停止true

于 2013-09-10T13:24:12.100 回答