3

请注意while版本如何评估表达式,但if版本不会。

begin
  puts 'hi'
  1
end while false
# => hi
# => nil 

begin 
  puts 'hi'
  1
end if false
# => nil 

begin但是如果我们使用一个没有...的表达式,end它就不会急切地评估它。

puts 'hi' while false
# => nil 

这种表面上的差异是否有原因?

4

3 回答 3

3

begin-end-while在其他语言中也称为 do-while)应该至少运行代码块一次(因此导致打印“hi”)并在满足条件时重复它。

while X
    Y
end

等于

begin
    Y
end while X

Y如果条件X从未满足,第一个将永远不会执行代码块。第二个将首先评估代码块Y一次,然后检查是否满足条件X:如果满足,则它会Y一次又一次地运行代码块,直到条件X评估为false

相反,普通begin-end-if块与任何其他 if 块一样被视为:如果条件表达式的计算结果为 ,它将被忽略(或只是不执行)false

if X
    Y 
end

相反,等于:

begin
    Y
end if X

这与以下内容相同:

Y if X
于 2013-08-14T20:13:05.353 回答
0

后缀符号只是预先设置条件的简写。这由解释器“重写”以预先设置条件。

但是,do-while 循环是它自己的循环类型。它不仅仅是将 while() 放在前面的简写。

于 2013-08-14T20:13:44.673 回答
-2

您假设begin..end是一个复合语句,但它不是,它begin启动一个具有异常处理的区域并end仅标记该区域的另一个边界。begin...块的内容end仍然是多条语句。

Ruby 不需要复合语句,因为它具有程序员友好的块终止符。但是您可以使用 来制作它们(...),因此请尝试以下操作:

(
  puts 'hi'
  123
) if false
于 2013-08-14T20:14:16.127 回答