1

我在 Ruby 中看到过这种语法:

x = ary['value'] || Value.new

我得到的部分是 || 的左侧 为假,则右侧将被执行。但我没有得到以下部分:

false || (object) becomes (object)

我以为|| 应该解析为布尔值。至少在大多数其他语言中。为什么 Ruby 解析为一个对象。

我也有另一个类似的问题:

'test' || true
=> "test"

“测试”如何被评估为真实?

4

5 回答 5

4

在 Ruby中nil,并且falseis 仅计算为false始终。往下看:

p a = nil || 2   #=> 2
p a = false || 2 #=> 2  
p nil || false || 2 #=> 2
p '' || 2 #=> ""

如需更多参考,请查看此处True, False And Nil Objects In RubyRuby short circuit "or" explanation

于 2013-04-16T18:38:31.560 回答
1

在 Ruby 中,有四种情况:

假就是假

真的是真的

Nil 是假的

其他任何事情都是真实的

所以,

5 && 8 #=> 8
5 || false #=> 5
false || 5 #=> 5
(5 && 8) == true #=> false
!!(5 && 8) == true #=> true
!!(false || nil) == false #=> true
于 2013-04-16T18:42:28.353 回答
1

Ruby 中布尔求值的重要经验法则是,只有对象NilClassFalseClass被评估为假。任何其他对象,包括String,都被评估为真,即使它是空的。

于 2013-04-16T18:43:24.563 回答
1

在 Ruby 中,与大多数编程语言一样,一些值是真值,而另一些值是假值。一个真值是true为了布尔评估的目的,同样一个假值是false

然而,truthy 值实际上并没有被强制转换为,true而 falsey 也没有被强制转换为false,这让布尔表达式评估为有用的东西,而不是一个平面的trueor false

nil并且false是 Ruby 中唯一的错误值。请注意0,与大多数其他语言不同,这是真的。

有关详细信息,请参阅https://gist.github.com/jfarmer/2647362 。

于 2013-04-16T18:48:01.833 回答
1

这称为短路

通过将其他表达式与||运算符连接在一起形成的任何表达式都将被短路,这意味着它在第一个真值表达式处“停止” 。

所以考虑这个例子:

nil || Value.new

Ruby 解释器首先查看nil;然后,由于这不是真的,它继续下一个表达式。

现在考虑问题末尾的示例:

"test" || true

Ruby先看了看"test";既然这是真的,评估就停在那里。

运算符也是如此&&,它本质上是相同的短路逻辑,但只有在找到虚假表达式时才会停止。

举个例子:

person && person.name

如果personnil,那么上面的表达式将评估为,nil因为这是第一个错误的表达式。

另一方面:

person && person.male? && person.name

假设person不是零,而是女性。然后(假设male?返回false)上面的表达式将计算为false

当然,如果没有表达式是错误的,那么&&运算符只会给你最后一个(这通常是你想要的)。

于 2013-04-16T18:48:53.700 回答