在玩 IRB 时,我遇到了这个:
a = -1
b = 1
(a and b) > 0
true
但是返回
(false and true) == true
返回false
。
为什么第一条语句返回true
?在'pickaxe'中,我读到“只有当两个操作数都为真时and
,&&
才会评估为真。只有当第一个操作数为真时,它们才会评估第二个操作数[...]”
这意味着——对我来说——第一个语句应该返回false
在玩 IRB 时,我遇到了这个:
a = -1
b = 1
(a and b) > 0
true
但是返回
(false and true) == true
返回false
。
为什么第一条语句返回true
?在'pickaxe'中,我读到“只有当两个操作数都为真时and
,&&
才会评估为真。只有当第一个操作数为真时,它们才会评估第二个操作数[...]”
这意味着——对我来说——第一个语句应该返回false
从 ruby 的角度来看,-1 和 1 都是“真实”值。这就是为什么
-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
为什么应该是假的?两个操作数a
和b
都不为假,甚至不为零..
IIRC,在 Ruby 中,每个不同于 false/nil 的值都被认为是 true。甚至为零。因此0 and 0
是真的。-1 和 1 肯定也是!
编辑:啊,我刚刚明白你的意思。你的意思是第一个表达式-1 and 1
应该返回-1?不,这就是 OR 所做的!
-1 and 1 => 1
-1 or 1 => -1
AND 评估所有操作数的“真”结果,并仅在一项为“假”时减少检查。
OR 评估所有操作数的“假”结果,并仅在一项为“真”时减少检查
在 ruby 中,对象为假的唯一时间是它是否为假或 nil。
>> !!nil # false
>> !!false # false
>> !!-1 # true
在你的语法中,当你尝试时不可能得到你想说的
>> (1 and -1) > 0
因为and
应该用于返回真或假,但我发现有趣的是返回的值
>> (1 and -1) # -1
>> (-1 and 1) # 1
所以有(b and a) > 0
会返回false,这很有趣
(1 and -1)
将返回 -1,因为and
运算符需要满足所有条件。我今天有事。