1

我对红宝石中的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 } => []

如果我只在拒绝方法上使用一个条件,则结果符合预期。但如果我包含 OR 运算符,结果结果是空的。有人可以为我澄清这一点。

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

3 回答 3

8

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

!(A || B)等于!A && !B和不等于!A || !B

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

(1..10).reject {|i| i % 3 != 0 && i % 5 != 0 } # => [3, 5, 6, 9, 10]
于 2011-07-04T16:23:03.390 回答
3

你遇到了德摩根定律之一。

p And q = Not((Not p ) Or (Not q ))
p Or   q  = Not((Not p ) And (Not q ))

它很接近,但您忘记更改操作员。

于 2011-07-04T16:50:43.230 回答
0

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

(1..10).reject {|i| i % 3 != 0 && i % 5 != 0 } => [3, 5, 6, 9, 10]
于 2011-07-04T16:23:26.010 回答