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

リジェクトメソッドで1つの条件を使用すると、結果は期待通りです。しかし、OR演算子を含めると、結果は空であることがわかります。誰かが私のためにこれを明確にすることができますか?

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

答えて

8

あなたは、基本的なロジックの間違いを作っている:

!(A || B)!A && !Bと同等と!A || !Bと同等ではありません。

あなたが&&にあなたの第二の例では||を変更するのであれば、それから2番目の例では、最初と同じ結果を与えるだろう:コードの2番目の部分で

(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のいずれかを実行しました。

PそしてQ =しない((未P)または   (未Q))
Pそれとも    Q   =しない((未P )および(Not q))

演算子を変更するのを忘れてしまった。

関連する問題