请注意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
这种表面上的差异是否有原因?
请注意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
这种表面上的差异是否有原因?
(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
后缀符号只是预先设置条件的简写。这由解释器“重写”以预先设置条件。
但是,do-while 循环是它自己的循环类型。它不仅仅是将 while() 放在前面的简写。
您假设begin
..end
是一个复合语句,但它不是,它begin
启动一个具有异常处理的区域并end
仅标记该区域的另一个边界。begin
...块的内容end
仍然是多条语句。
Ruby 不需要复合语句,因为它具有程序员友好的块终止符。但是您可以使用 来制作它们(...)
,因此请尝试以下操作:
(
puts 'hi'
123
) if false