奇数Ruby-If语句问题
我注意到Ruby中If语句中有一点奇怪。下面是一个例子:奇数Ruby-If语句问题,ruby,Ruby,我注意到Ruby中If语句中有一点奇怪。下面是一个例子: my_number = nil if my_number < 3 'number is less than 3' end 显然,当您运行这段代码时,您将得到Fixnum与nil failed error的比较。现在有点奇怪。如果我在If语句中稍作更改以检查nil,它就可以正常工作。例如: my_number = nil if my_number && my_number < 3 'number i
my_number = nil
if my_number < 3
'number is less than 3'
end
显然,当您运行这段代码时,您将得到Fixnum与nil failed error的比较。现在有点奇怪。如果我在If语句中稍作更改以检查nil,它就可以正常工作。例如:
my_number = nil
if my_number && my_number < 3
'number is less than 3'
end
添加检查为nil使其不会崩溃。这听起来可能很愚蠢,但我不明白为什么会这样。它不应该仍然抛出一个错误吗
感谢所有能够解释这一点的人谢谢 测试nil必须是正常的,所以如果nil或类似的东西在几乎所有语言中都是正常的 但对于算术比较,如果它没有抛出异常,则必须返回true或false。无论哪种方式都有问题 真正的种类是没有意义的,因为nil将同时小于和>3 False几乎同样糟糕,因为现在nil<3和nil>=3都是False,这并不理想
因此,比较方法抛出一个异常。问题解决了。测试nil必须是可以的,所以如果nil或类似的东西在几乎所有语言中都是可以的 但对于算术比较,如果它没有抛出异常,则必须返回true或false。无论哪种方式都有问题 真正的种类是没有意义的,因为nil将同时小于和>3 False几乎同样糟糕,因为现在nil<3和nil>=3都是False,这并不理想
因此,比较方法抛出一个异常。问题已解决。布尔表达式以所谓的短路方式进行计算。也就是说,一旦知道结果,它就不会一直尝试计算表达式 所以它会计算if my_编号,因为这是false,所以没有必要继续,因为false&&总是false
这是一个有用的语言功能,许多语言都是这样工作的。我可以想到原始的Visual Basic是一个例外,因为它允许您完全执行此类测试,而不需要繁琐的嵌套“if”。布尔表达式以所谓的短路方式进行计算。也就是说,一旦知道结果,它就不会一直尝试计算表达式 所以它会计算if my_编号,因为这是false,所以没有必要继续,因为false&&总是false
这是一个有用的语言特性,许多语言都是这样工作的。我可以想到原始的Visual Basic是一个例外,因为它可以让您在不需要繁琐的嵌套“if”的情况下进行此类测试。这不是Ruby特有的方式:我在我使用过的所有语言中都注意到了这种行为,从Pascal到Java
如果有布尔表达式b1&&b2&&b3…&&bn,大多数语言保证bi将从左到右求值,如果某些bi被证明为错误,则将停止求值。因为整个表达都是假的。布尔| |运算符也是如此。这并不是Ruby特有的:我在我使用过的所有语言中都注意到了这种行为,从Pascal到Java
如果有布尔表达式b1&&b2&&b3…&&bn,大多数语言保证bi将从左到右求值,如果某些bi被证明为错误,则将停止求值。因为整个表达都是假的。布尔| |运算符也是如此。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在循环和其他测试中有很大帮助:
false == nil
=> false
因为and is false的第一部分ruby做的是懒惰的事情,如果它大于3,甚至懒得计算下一位。nil是错误的。在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在循环和其他测试中有很大帮助:
false == nil
=> false
由于and is false ruby的第一部分做了一件懒惰的事情,如果下一位大于3,甚至都懒得计算它。发生的事情称为短路计算。您的声明可以这样理解:
if( my_number )
if( my_number < 3)
'number is less than 3'
end
end
由于第一个条件为假,因此没有理由评估语句的第二个条件-my_编号<3部分。发生的情况称为短路评估。您的声明可以这样理解:
if( my_number )
if( my_number < 3)
'number is less than 3'
end
end
由于第一个条件为假,因此没有理由评估语句的第二个条件-my_编号<3部分