AND运算符在第一个为真时返回第二个值,第一个在它为假的时候返回
1 && 2 ---> 2
0 && 1 ---> 0
为什么OR操作在第一个值为false时不返回第二个值,但在第一个值为true时返回第二个值
0 || 1 ---> 0
1 || 0 ---> 1
答案 0 :(得分:3)
只要他们知道他们给你的表达式的值,就会对OR和AND进行短路评估。 在Ruby中,0和1都是正确的,它们是真正的值。所以
0 || 1 is 0
因为0是真的。
只需nil || 1
或false || 1
即可返回1.
答案 1 :(得分:1)
||是一个逻辑运算符,而不是一个按位运算符。与例如C的其他语言不同,0不是" falsey"红宝石的价值。
因为||是一个短路逻辑运算符,您有以下等价语句:
定义的值" 0" ||定义的值" 1"
哪个ruby正确地评估为 truthy表达式A || truthy表达式B 并返回 truthy表达式A 即0。
见这里:https://gist.github.com/jfarmer/2647362
了解" Truthy"和" Falsey" Python和Ruby中的值。
答案 2 :(得分:1)
Ruby只在这样的表达式中评估它所需的数量,然后停止,你看到的返回只是它评估的表达式的最后一部分。 所以对你的&& case,它总是必须运行到最后,以防后一个子句返回false,这将导致AND为假。
实际上你的例子是错的:
irb> 0 && 1
=> 1
预计这是因为0在Ruby中是真实的,而不像在C中那样是假的。
对于OR情况,它可以在遇到任何真实的东西时立即停止,并且不需要为其余部分打扰。
0 || false # => 0
false || 0 # => 0
false || 0 || 2 # => 0
如果你想强制这样的表达式为布尔值,那么你经常会看到它的完成方式:
!!(expression)
!!(0 || 1) => true
!!(nil || false) => false
答案 3 :(得分:0)
这里有两件事:
0
是真实的(这意味着它在布尔上下文中被评估为真)。||
)快捷方式,如果它是真的,则返回左参数。将这两者放在一起,您就可以0 || 1
返回0