Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇数Ruby-If语句问题_Ruby - Fatal编程技术网

奇数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

我注意到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 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部分