在玩IRB时,我遇到了这个:
a = -1
b = 1
(a and b) > 0
返回true
,但是
(false and true) == true
返回false
。
为什么第一个语句会返回true
?在'pickaxe'中,我读到“只有当两个操作数都为真时,and
和&&
才会求值为真。只有当第一个操作数为真时才评估第二个操作数[...]”
这意味着 - 对我来说 - 第一个陈述应该返回false
答案 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)
为什么它应该是假的?操作数a
和b
都不是假的,甚至不是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
运算符需要满足所有条件。我今天有问题。