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
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.
Voici:
unless @players.include?(p.name)
...
end
Vous pouvez consulter le Ruby Style Guide pour plus d'informations sur des techniques similaires.
Que diriez-vous de ce qui suit:
unless @players.include?(p.name)
....
end
module Enumerable
def does_not_include?(item)
!include?(item)
end
end
Ok, mais sérieusement, à moins que le fonctionne bien.
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
Utilisez à moins que.
unless @players.include?(p.name) do
...
end
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
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
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.
Essayez quelque chose comme ça:
@players.include?(p.name) ? false : true
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