Есть ли противоположность включения? для рубиновых массивов?

У меня есть следующая логика в моем коде:

if [email protected]?(p.name)
  ...
end

@players - это массив. Есть ли способ, чтобы я мог избежать ! ?

В идеале этот фрагмент будет:

if @players.does_not_include?(p.name)
  ...
end

Ответ 2

Здесь вы идете:

unless @players.include?(p.name)
  ...
end

Более подробную информацию о похожих методах вы можете посмотреть в Руководстве по стилю Ruby.

Ответ 3

Как насчет следующего:

unless @players.include?(p.name)
  ....
end

Ответ 4

module Enumerable
  def does_not_include?(item)
    !include?(item)
  end
end

Хорошо, но серьезно, если не работает нормально.

Ответ 5

Глядя только на Руби

TL; DR

Использовать none? Передав это блок с == для сравнения:

[1, 2].include?(1)
  #=> true
[1, 2].none? { |n| 1 == n  }
  #=> false

Массив # включить?

Array#include? принимает один аргумент и использует == для проверки каждого элемента в массиве:

player = [1, 2, 3]
player.include?(1)
 #=> true

Не Enumerable # ни?

Enumerable#none? может также принять один аргумент, в этом случае он использует === для сравнения. Чтобы include? противоположное поведение include? мы опускаем параметр и передаем ему блок, используя == для сравнения.

player.none? { |n| 7 == n }
 #=> true 
!player.include?(7)    #notice the '!'
 #=> true

Вопросы для рассмотрения

В приведенном выше примере мы можем использовать:

player.none?(7)
 #=> true

Это потому, что Integer#== и Integer#=== эквивалентны. Но учтите:

player.include?(Integer)
 #=> false
player.none?(Integer)
 #=> false

none? возвращает false потому что Integer === 1 #=> true. Но неужели notinclude? метод должен вернуть true. Итак, как мы делали раньше:

player.none? { |e| Integer == e  }
 #=> true

Ответ 6

Используйте, если.

unless @players.include?(p.name) do
  ...
end

Ответ 7

Вы можете использовать

unless @players.include?(p.name) do
...
end

если не противоположно если.

или вы можете использовать отклонить вы можете отклонить ненужные элементы

@players.reject{|x| x==p.name}

после получения результатов вы можете сделать вашу реализацию

Ответ 8

Использование unless отлично подходит для операторов с одинарными предложениями include?, но, например, когда вам нужно проверить включение чего-либо в один Array, но не в другой, использование include? с exclude? намного дружелюбнее.

if @players.include? && @spectators.exclude? do
  ....
end

Но, как говорит dizzy42 выше, для использования exclude? требуется ActiveSupport

Ответ 9

Попробуйте что-то вроде этого:

@players.include?(p.name) ? false : true

Ответ 10

Попробуйте это, это чистый Ruby, поэтому нет необходимости добавлять какие-либо периферийные рамки

if @players.include?(p.name) == false do 
  ...
end

Я боролся с подобной логикой в ​​течение нескольких дней, и после проверки нескольких форумов и советов Q & A мало что получилось, что решение было довольно простым.

Ответ 11

Я искал это для себя, нашел это, а затем и решение. Люди используют запутанные методы и некоторые методы, которые не работают в определенных ситуациях или не работают вообще.

Я знаю это слишком поздно, учитывая, что это было опубликовано 6 лет назад, но, надеюсь, будущие посетители найдут это (и, надеюсь, это сможет очистить их и ваш код).

Простое решение:

if not @players.include?(p.name) do
  ....
end