【问题标题】:Why does ruby eagerly evaluate expressions for 'while' but not 'if'为什么 ruby​​ 急切地评估“while”而不是“if”的表达式
【发布时间】:2013-08-16 23:17:59
【问题描述】:

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

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

【问题讨论】:

    标签: ruby


    【解决方案1】:

    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
    

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

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

    if X
        Y 
    end
    

    相反,等于:

    begin
        Y
    end if X
    

    等同于:

    Y if X
    

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您假设begin .. end 是一个复合语句,但事实并非如此,begin 启动一个带有异常处理的区域,end 只是标记该区域的另一个边界。 begin...end 块的内容仍然是多条语句。

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

      (
        puts 'hi'
        123
      ) if false
      

      【讨论】:

      • Begin ... End 返回最后一个表达式的值。
      猜你喜欢
      • 2020-09-05
      • 2018-09-17
      • 2012-04-29
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      相关资源
      最近更新 更多