为什么此代码在不使用lambda作为条件参数的情况下变为无限循环

时间:2013-09-10 13:12:18

标签: ruby lambda

我正在阅读使用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&lt; 3)和块参数?

中使用此函数

P.S。我看到this question但仍无法在那里发表评论!

1 个答案:

答案 0 :(得分:1)

在上一个代码示例中,a<3在调用my_while行时被评估。

由于a刚刚在前一行中设置为0a<3的计算结果为真(0小于3)。这意味着在my_while内,cond设置为true。它仍然是true,因为a<3永远不会被重新评估,即使a已更改。因此while循环保持循环。

在循环的每次迭代中使用lambda和.call确保为每个循环计算条件a<3,允许while循环在a<3不再评估时停止到true