Ich habe die folgende Logik in meinem Code:
if !@players.include?(p.name)
...
end
@players
ist ein Array. Gibt es eine Methode, um das zu vermeiden !
?
Im Idealfall wäre dieses Snippet:
if @players.does_not_include?(p.name)
...
end
Ich habe die folgende Logik in meinem Code:
if !@players.include?(p.name)
...
end
@players
ist ein Array. Gibt es eine Methode, um das zu vermeiden !
?
Im Idealfall wäre dieses Snippet:
if @players.does_not_include?(p.name)
...
end
Antworten:
if @players.exclude?(p.name)
...
end
Active fügt die exclude?
Methode Array
, Hash
und String
. Dies ist kein reiner Rubin, sondern wird von vielen Rubinisten verwendet.
require 'active_support/core_ext/enumerable'
Bitte schön:
unless @players.include?(p.name)
...
end
Weitere Informationen zu ähnlichen Techniken finden Sie im Ruby Style Guide .
if flag unless @players.include?(p.name)
ist umständlich und if flag && !@players.include?(p.name)
verwendet Negation.
if
let nur true
den Zustand passieren, unless
passieren lässt false
und nil
. Dies führt manchmal zu schwer zu findenden Fehlern. Deshalb bevorzuge ichexclude?
Wie wäre es mit folgendem:
unless @players.include?(p.name)
....
end
Nur Ruby betrachten:
TL; DR
Verwenden none?
Sie ==
zum Vergleich einen Block mit :
[1, 2].include?(1)
#=> true
[1, 2].none? { |n| 1 == n }
#=> false
Array#include?
akzeptiert ein Argument und ==
prüft mit jedem Element im Array:
player = [1, 2, 3]
player.include?(1)
#=> true
Enumerable#none?
kann auch ein Argument akzeptieren, in welchem Fall es ===
für den Vergleich verwendet wird. Um das gegenteilige Verhalten zu erreichen, lassen include?
wir den Parameter weg und übergeben ihm einen Block, der ==
für den Vergleich verwendet wird.
player.none? { |n| 7 == n }
#=> true
!player.include?(7) #notice the '!'
#=> true
Im obigen Beispiel können wir tatsächlich verwenden:
player.none?(7)
#=> true
Das liegt daran Integer#==
und Integer#===
sind gleichwertig. Aber bedenken Sie:
player.include?(Integer)
#=> false
player.none?(Integer)
#=> false
none?
kehrt zurück, false
weil Integer === 1 #=> true
. Aber wirklich eine legitime notinclude?
Methode sollte zurückkehren true
. Also wie vorher:
player.none? { |e| Integer == e }
#=> true
module Enumerable
def does_not_include?(item)
!include?(item)
end
end
Ok, aber im Ernst, es sei denn, es funktioniert gut.
unless
Es ist in Ordnung für das gezeigte Snippet, aber die Bedingung kann komplexer sein. Ich denke, es ist praktisch, diese negierten Methoden zu haben, sie erlauben mehr deklarativen Code.
Verwendung unless
:
unless @players.include?(p.name) do
...
end
Kannst du --- benutzen:
unless @players.include?(p.name) do
...
end
unless
ist das Gegenteil von if
, oder Sie können verwenden reject
.
Sie können reject
die nicht benötigten Elemente:
@players.reject{|x| x==p.name}
Nachdem Sie die Ergebnisse erhalten haben, können Sie Ihre Implementierung durchführen.
Die Verwendung von unless
ist für Anweisungen mit einzelnen include?
Klauseln in Ordnung. Wenn Sie jedoch beispielsweise die Aufnahme von etwas in eine, Array
aber nicht in eine andere überprüfen müssen , ist die Verwendung von include?
with exclude?
viel freundlicher.
if @players.include? && @spectators.exclude? do
....
end
Aber wie dizzy42 oben sagt, exclude?
erfordert die Verwendung von ActiveSupport
Versuchen Sie dies, es ist reines Ruby, sodass keine peripheren Frameworks hinzugefügt werden müssen
if @players.include?(p.name) == false do
...
end
Ich hatte einige Tage lang mit einer ähnlichen Logik zu kämpfen, und nachdem ich mehrere Foren und Q & A-Boards ohne Erfolg überprüft hatte, stellte sich heraus, dass die Lösung eigentlich ziemlich einfach war.
Ich habe selbst nachgesehen, dies gefunden und dann eine Lösung gefunden. Menschen verwenden verwirrende Methoden und einige Methoden, die in bestimmten Situationen nicht oder überhaupt nicht funktionieren.
Ich weiß, dass es jetzt zu spät ist, wenn man bedenkt, dass dies vor 6 Jahren veröffentlicht wurde, aber hoffentlich finden zukünftige Besucher dies (und hoffentlich kann es ihren und Ihren Code bereinigen.)
Einfache Lösung:
if not @players.include?(p.name) do
....
end
do
gültige Rubin? Ich bekomme eine Fehlermeldungsyntax error, unexpected end-of-input
(funktioniert, wenn ich die entfernedo
)