2011-07-04 62 views
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 } => [] 

如果我只對reject方法使用一個條件,結果如預期。但是如果我包含OR運算符,結果是空的。有人能爲我澄清這一點嗎?

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

回答

8

你正在一個基本的邏輯錯誤:

!(A || B)相當於!A && !B和不等同於!A || !B

所以,如果你在你的第二個例子改變||&&,那麼你的第二個例子會給出相同的結果作爲第一:

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

謝謝你,我想我在這些事情上生鏽...... – jhenriquez

0

在第二一段代碼,更改了平等,所以您需要將||更改爲&&

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

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

pq =未((不p)或   (未q))
p或者    q   =未((不p )和(不是q))

它很接近,bu你忘了改變操作員。