Ruby逻辑“和”运算符

时间:2013-03-07 09:22:48

标签: ruby operator-keyword

在玩IRB时,我遇到了这个:

a = -1
b = 1
(a and b) > 0

返回true,但是

(false and true) == true

返回false

为什么第一个语句会返回true?在'pickaxe'中,我读到“只有当两个操作数都为真时,and&&才会求值为真。只有当第一个操作数为真时才评估第二个操作数[...]”

这意味着 - 对我来说 - 第一个陈述应该返回false

3 个答案:

答案 0 :(得分:3)

从ruby的角度来看,-1和1都是“truthy”值。这就是为什么

-1 and 1 # => 1
false and true => false
  

第一个语句应该返回false

我没看到你从哪里得到这个。你不是把它与OR运算符混淆了吗?

a = -1
b = 1

a and b # => 1
(a and b) > 0 # => true

a && b # => 1
(a && b) > 0 # => true

a || b # => -1
(a || b) > 0 # => false

答案 1 :(得分:3)

为什么它应该是假的?操作数ab都不是假的,甚至不是nil ..

IIRC,在Ruby中,与false / nil不同的每个值都被认为是真的。甚至为零。因此0 and 0是真的。肯定也是-1和1!

编辑:啊,我刚刚掌握了你的意思。你的意思是第一个表达式-1 and 1应该返回-1?不,这就是OR的作用!

-1 and 1   =>  1
-1 or 1    => -1

AND评估所有操作数的“真实”结果,并仅在一个项目为“假”时减少检查 OR评估'false'结果的所有操作数,并仅在一项为'true'时减少检查

答案 2 :(得分:0)

在ruby中,对象为false的唯一时间是false或nil。

>> !!nil # false
>> !!false # false
>> !!-1 # true

在你的语法中,当你尝试

时,你不可能得到你想说的话
>> (1 and -1) > 0

因为and应该用来返回true或false,但我觉得有趣的是返回值

>> (1 and -1) # -1
>> (-1 and 1) # 1

所以让(b and a) > 0返回false很有意思

(1 and -1)将返回-1,因为and运算符需要满足所有条件。我今天有问题。