web-dev-qa-db-fra.com

Y a-t-il un contraire d'inclure? pour Ruby Arrays?

J'ai la logique suivante dans mon code:

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

@players est un tableau. Existe-t-il une méthode pour éviter le !?

Idéalement, cet extrait serait:

if @players.does_not_include?(p.name)
  ...
end
150
Tyler DeWitt
if @players.exclude?(p.name)
    ...
end

ActiveSupport ajoute la méthode exclude? à Array, Hash et String. Ce n'est pas pur Ruby, mais est utilisé par BEAUCOUP de rubis.

Source: Extensions Active Support Core (guides Rails)

302
dizzy42

Voici:

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

Vous pouvez consulter le Ruby Style Guide pour plus d'informations sur des techniques similaires.

81
Bozhidar Batsov

Que diriez-vous de ce qui suit:

unless @players.include?(p.name)
  ....
end
10
ilasno
module Enumerable
  def does_not_include?(item)
    !include?(item)
  end
end

Ok, mais sérieusement, à moins que le fonctionne bien.

6
Jesse Wolgamott

Regarder Ruby seulement

TL; DR

Utilisez none? en lui passant un bloc avec == pour la comparaison:

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

Array # include?

Array#include? accepte un argument et utilise == pour vérifier chaque élément du tableau:

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

Enumerable # none?

Enumerable#none? peut également accepter un argument, auquel cas il utilise === pour la comparaison. Pour obtenir le comportement opposé à include?, nous omettons le paramètre et lui passons un bloc en utilisant == pour la comparaison.

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

Points à considérer

Dans l'exemple ci-dessus, nous pouvons utiliser:

player.none?(7)
 #=> true

C'est parce que Integer#== et Integer#=== sont équivalents. Mais considérons:

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

none? renvoie false car Integer === 1 #=> true. Mais en réalité, une méthode légitime notinclude? devrait renvoyer true. Donc, comme nous l'avons fait auparavant:

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

Utilisez à moins que.

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

Peux tu utiliser

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

sauf si est opposé à la si.

ou vous pouvez utiliser refuse vous pouvez rejeter les éléments non requis

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

après l'obtention des résultats, vous pouvez faire votre mise en œuvre

1
tekuri

Je surveillais cela pour moi-même, trouvais cela, puis une solution. Les gens utilisent des méthodes confuses et certaines méthodes qui ne fonctionnent pas dans certaines situations ou qui ne fonctionnent pas du tout.

Je sais qu'il est trop tard maintenant, vu que cela a été posté il y a 6 ans, mais j'espère que les futurs visiteurs le trouveront (et j'espère que cela pourra nettoyer leur code ainsi que votre code)

Solution simple:

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

Essayez ceci, c'est du pur Ruby, il n'y a donc pas besoin d'ajouter de frameworks périphériques

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

Je me débattais avec une logique similaire pendant quelques jours et après avoir consulté plusieurs forums et conseils de questions-réponses sans succès, la solution était en réalité assez simple. 

0
KarmaDeli

Essayez quelque chose comme ça: 

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

Utiliser unless convient aux déclarations avec des clauses include? simples, mais lorsque vous devez par exemple vérifier l'inclusion de quelque chose dans une variable Array mais pas dans une autre, l'utilisation de include? avec exclude? est beaucoup plus conviviale.

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

Mais comme dit dizzy42 ci-dessus, l'utilisation de exclude? nécessite ActiveSupport

0
MeWillWork4Food