我在 Ruby 中看到过这种语法:
x = ary['value'] || Value.new
我得到的部分是 || 的左侧 为假,则右侧将被执行。但我没有得到以下部分:
false || (object) becomes (object)
我以为|| 应该解析为布尔值。至少在大多数其他语言中。为什么 Ruby 解析为一个对象。
我也有另一个类似的问题:
'test' || true
=> "test"
“测试”如何被评估为真实?
在 Ruby中nil
,并且false
is 仅计算为false
始终。往下看:
p a = nil || 2 #=> 2
p a = false || 2 #=> 2
p nil || false || 2 #=> 2
p '' || 2 #=> ""
如需更多参考,请查看此处True, False And Nil Objects In Ruby
和Ruby short circuit "or" explanation
在 Ruby 中,有四种情况:
假就是假
真的是真的
Nil 是假的
其他任何事情都是真实的
所以,
5 && 8 #=> 8
5 || false #=> 5
false || 5 #=> 5
(5 && 8) == true #=> false
!!(5 && 8) == true #=> true
!!(false || nil) == false #=> true
Ruby 中布尔求值的重要经验法则是,只有对象NilClass
和FalseClass
被评估为假。任何其他对象,包括String
,都被评估为真,即使它是空的。
在 Ruby 中,与大多数编程语言一样,一些值是真值,而另一些值是假值。一个真值是true
为了布尔评估的目的,同样一个假值是false
。
然而,truthy 值实际上并没有被强制转换为,true
而 falsey 也没有被强制转换为false
,这让布尔表达式评估为有用的东西,而不是一个平面的true
or false
。
nil
并且false
是 Ruby 中唯一的错误值。请注意0
,与大多数其他语言不同,这是真的。
这称为短路。
通过将其他表达式与||
运算符连接在一起形成的任何表达式都将被短路,这意味着它在第一个真值表达式处“停止” 。
所以考虑这个例子:
nil || Value.new
Ruby 解释器首先查看nil
;然后,由于这不是真的,它继续下一个表达式。
现在考虑问题末尾的示例:
"test" || true
Ruby先看了看"test"
;既然这是真的,评估就停在那里。
运算符也是如此&&
,它本质上是相同的短路逻辑,但只有在找到虚假表达式时才会停止。
举个例子:
person && person.name
如果person
是nil
,那么上面的表达式将评估为,nil
因为这是第一个错误的表达式。
另一方面:
person && person.male? && person.name
假设person
不是零,而是女性。然后(假设male?
返回false
)上面的表达式将计算为false
。
当然,如果没有表达式是错误的,那么&&
运算符只会给你最后一个(这通常是你想要的)。