注意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
是否有这种看似不一致的原因?
答案 0 :(得分:3)
begin-end-while
(在其他语言中也称为do-while)is supposed to run the block of code at least once(因此导致打印“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
答案 1 :(得分:0)
后缀表示法只是预先设置条件的简写。这是由翻译人员“重写”预先确定的条件。
然而,do-while循环是它自己的循环类型。它不仅仅是预先设置while()的简写。
答案 2 :(得分:-2)
您假设begin
.. end
是一个复合语句,但不是,begin
启动一个带异常处理的区域,而end
只是标记了该地区的其他边界。 begin
... end
块的内容仍然是多个语句。
Ruby不需要复合语句,因为它具有程序员友好的块终止符。但你可以用(...)
制作它们,所以尝试类似:
(
puts 'hi'
123
) if false