1

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

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

true但是返回

(false and true) == true

返回false

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

这意味着——对我来说——第一个语句应该返回false

4

3 回答 3

3

从 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
于 2013-03-07T09:25:14.663 回答
3

为什么应该是假的?两个操作数ab都不为假,甚至不为零..

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 评估所有操作数的“假”结果,并仅在一项为“真”时减少检查

于 2013-03-07T09:25:26.863 回答
0

在 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运算符需要满足所有条件。我今天有事。

于 2013-03-07T09:29:55.303 回答