代码之家  ›  专栏  ›  技术社区  ›  CalebHC

奇数ruby if语句问题

  •  1
  • CalebHC  · 技术社区  · 14 年前

    我注意到Ruby中的if语句有点奇怪。下面是一个例子:

    my_number = nil
    if my_number < 3
       'number is less than 3'
    end
    

    显然,运行此代码时,会出现“fixnum与nil比较失败”错误。现在有点奇怪。如果我在if语句中做一点更改来检查是否为nil,它就会正常工作。例子:

    my_number = nil
    if my_number && my_number < 3
       'number is less than 3'
    end
    

    添加nil的检查使其不会崩溃。这听起来很愚蠢,但我不明白为什么会这样。它还应该抛出一个错误吗?

    感谢任何能解释这一点的人。谢谢!

    5 回复  |  直到 14 年前
        1
  •  4
  •   Dean Harding    14 年前

    if my_number false false && <anything>

        2
  •  1
  •   Nikita Rybak    14 年前

    b1 && b2 && b3 ... && bn bi false ||

        3
  •  0
  •   DigitalRoss    14 年前

    if nil

    真的没有意义,因为零比3大。

    假几乎和现在一样坏 nil < 3 nil >= 3 都是假的,这不太理想。

    所以,比较方法抛出了一个异常。问题解决了。

        4
  •  0
  •   Paul Rubel    14 年前

    nil是“falsy”。在IRB中尝试此操作:

    irb(main):001:0> puts "Nil is true " if nil
    => nil
    irb(main):002:0> puts "Nil is not true " if !nil
    Nil is not true
    => nil
    

    nil与false不同,但使其起作用对循环和其他测试有很大帮助:

    false == nil
    => false
    

    因为你的第一部分和is-false,Ruby会做一些懒惰的事情,如果是3,甚至不需要计算下一个位。

        5
  •  0
  •   rforte    14 年前

    发生的情况称为短路评估。你的陈述可以这样认为:

    if( my_number )
      if( my_number < 3)
        'number is less than 3'
      end
    end
    

    由于第一个条件为假,因此没有理由评估语句的第二个条件——my_number<3部分。