为什么ruby急切地评估'while'的表达式而不是'if'

时间:2013-08-14 20:09:10

标签: ruby

注意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 

是否有这种看似不一致的原因?

3 个答案:

答案 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