У меня есть следующая логика в моем коде:
if !@players.include?(p.name)
...
end
@players
это массив. Есть ли способ, чтобы я мог избежать !
?
В идеале этот фрагмент будет:
if @players.does_not_include?(p.name)
...
end
ruby-on-rails
ruby
Тайлер ДеВитт
источник
источник
do
действительным рубин? я получаю ошибкуsyntax error, unexpected end-of-input
(работает, если яdo
Ответы:
ActiveSupport добавляет
exclude?
методArray
,Hash
, иString
. Это не чистый Ruby, но используется большим количеством рубинов.Источник: Active Support Core Extensions (Руководства по Rails)
источник
require 'active_support/core_ext/enumerable'
Ну вот:
Вы можете взглянуть на Руководство по стилю Ruby для получения дополнительной информации о подобных методах.
источник
if flag unless @players.include?(p.name)
неудобно иif flag && !@players.include?(p.name)
использует отрицание.if
пустьtrue
проходит только условие,unless
пропускаетfalse
иnil
. Это иногда приводит к трудностям поиска ошибок. Поэтому я предпочитаюexclude?
Как насчет следующего:
источник
Глядя только на Ruby:
TL; DR
Для
none?
передачи используйте блок с==
:Array#include?
принимает один аргумент и использует==
для проверки каждого элемента в массиве:Enumerable#none?
Можно также принять один аргумент, в этом случае он использует===
для сравнения. Чтобы получить противоположное поведение,include?
мы опускаем параметр и передаем ему блок, используемый==
для сравнения.В приведенном выше примере мы можем использовать:
Это потому что
Integer#==
иInteger#===
эквивалентны. Но учтите:none?
возвращаетсяfalse
потому чтоInteger === 1 #=> true
. Но действительно законныйnotinclude?
метод должен вернутьсяtrue
. Итак, как мы делали раньше:источник
Хорошо, но если серьезно, то разве работает нормально.
источник
unless
это нормально для показанного фрагмента, но условие может быть более сложным. Я думаю, что эти отрицательные методы удобно использовать, они допускают более декларативный код.Используйте
unless
:источник
Вы можете использовать:
unless
противоположенif
, или вы можете использоватьreject
.Вы можете
reject
не обязательные элементы:после получения результатов вы можете заняться реализацией.
источник
Использование
unless
отлично подходит для операторов с одиночнымиinclude?
предложениями, но, например, когда вам нужно проверить включение чего-либо в одном,Array
а не в другом, использованиеinclude?
withexclude?
намного удобнее.Но, как говорит dizzy42 выше, использование
exclude?
ActiveSupport требуетисточник
Попробуйте что-то вроде этого:
источник
Попробуйте, это чистый Ruby, поэтому нет необходимости добавлять какие-либо периферийные платформы
Я боролся с подобной логикой в течение нескольких дней, и после небольшой проверки нескольких форумов и форумов, посвященных вопросам и ответам, оказалось, что решение было на самом деле довольно простым.
источник
Я искал это для себя, нашел это, а затем и решение. Люди используют запутанные методы и некоторые методы, которые не работают в определенных ситуациях или не работают вообще.
Я знаю, что сейчас слишком поздно, учитывая, что это было опубликовано 6 лет назад, но, надеюсь, будущие посетители найдут это (и, надеюсь, это может очистить их и ваш код).
Простое решение:
источник