我正在阅读使用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但仍无法在那里发表评论!
答案 0 :(得分:1)
在上一个代码示例中,a<3
在调用my_while
行时被评估。
由于a
刚刚在前一行中设置为0
,a<3
的计算结果为真(0小于3)。这意味着在my_while
内,cond
设置为true
。它仍然是true
,因为a<3
永远不会被重新评估,即使a
已更改。因此while
循环保持循环。
在循环的每次迭代中使用lambda和.call
确保为每个循环计算条件a<3
,允许while循环在a<3
不再评估时停止到true
。