Как отрицать дизъюнкцию - PullRequest
1 голос
/ 04 июля 2011

Я немного запутался с Enumerator # reject в ruby. Рассмотрим следующий код:

(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..10).reject {|i| i % 3 != 0} => [3, 6, 9]

Ответы [ 3 ]

8 голосов
/ 04 июля 2011

Вы делаете основную логическую ошибку:

!(A || B) эквивалентно !A && !B и НЕ эквивалентно !A || !B.

Так что если вы измените || в вашемвторой пример для &&, тогда ваш второй пример даст тот же результат, что и первый:

(1..10).reject {|i| i % 3 != 0 && i % 5 != 0 } # => [3, 5, 6, 9, 10]
3 голосов
/ 04 июля 2011

Вы столкнулись с одним из законов де Моргана .

p И q = Нет ((Не p ) Или (Не q ))
p Или q = Не ((Не p ) И (Не q ))

Это было близко, но вы забыли сменить оператора.

0 голосов
/ 04 июля 2011

Во втором фрагменте кода вы изменили равенство, поэтому вам нужно изменить || на &&.

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