Вопрос по ruby, ruby-on-rails – Есть ли противоположность включить? для Ruby Arrays?

152

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

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

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

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

if @players.does_not_include?(p.name)
  ...
end
этоdo действительный рубин? я получаю ошибкуsyntax error, unexpected end-of-input (работает, если я удалюdo) maxymoo

Ваш Ответ

10   ответов
0

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

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

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

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

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

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

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

0

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

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

unless @players.include?(p.name)
  ....
end
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Tyler DeWitt
Error: User Rate Limit Exceeded
2

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

unless @players.include?(p.name) do
  ...
end
5
Looking at Ruby only

TL;DR

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

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

Array#include?

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

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

Enumerable#none?

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

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

Points to consider

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

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
82

Ну вот:

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

Вы могли бы взглянуть наRuby Style Guide для получения дополнительной информации о подобных методах.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededif flag unless @players.include?(p.name)Error: User Rate Limit Exceededif flag && [email protected]?(p.name)Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededifError: User Rate Limit ExceededtrueError: User Rate Limit ExceededunlessError: User Rate Limit ExceededfalseError: User Rate Limit ExceedednilError: User Rate Limit Exceededexclude?
Error: User Rate Limit Exceeded
1

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

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

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

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

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

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

307
if @players.exclude?(p.name)
    ...
end

exclude? метод дляArray, Hash, а такжеString, Это не чистый Ruby, но используется большим количеством рубинов.

Источник:Расширения активной поддержки ядра (Rails Guides)

Documentation here
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

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

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

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

Похожие вопросы