如何否定分离

时间:2011-07-04 16:20:14

标签: ruby boolean-logic demorgans-law

我对红宝石中的Enumerator#reject感到困惑。请考虑以下代码:

(1..10).select {|i| i % 3 == 0 || i % 5 == 0 } => [3, 5, 6, 9, 10]

以下行不应该相同吗?

(1..10).reject {|i| i % 3 != 0 || i % 5 != 0 } => []

如果我只在reject方法上使用一个条件,结果就像预期的那样。但如果我包含OR运算符,结果结果为空。有人可以为我澄清一下。

(1..10).reject {|i| i % 3 != 0} => [3, 6, 9]

3 个答案:

答案 0 :(得分:8)

你犯了一个基本的逻辑错误:

!(A || B)相当于!A && !B,而不等同于!A || !B

因此,如果您将第二个示例中的||更改为&&,那么您的第二个示例将提供与第一个示例相同的结果:

(1..10).reject {|i| i % 3 != 0 && i % 5 != 0 } # => [3, 5, 6, 9, 10]

答案 1 :(得分:3)

您遇到了De Morgan's laws之一。

p q =不((不 p )或(不 q ))
p q =不((不 p )和(不 q ))

很接近,但你忘了改变操作员。

答案 2 :(得分:0)

在第二段代码中,您更改了相等性,因此您需要将||更改为&&

(1..10).reject {|i| i % 3 != 0 && i % 5 != 0 } => [3, 5, 6, 9, 10]