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
ruby-on-rails
ruby
Tyler DeWitt
quelle
quelle
do
gültige Rubin? Ich bekomme eine Fehlermeldungsyntax error, unexpected end-of-input
(funktioniert, wenn ich die entfernedo
)Antworten:
Active fügt die
exclude?
MethodeArray
,Hash
undString
. Dies ist kein reiner Rubin, sondern wird von vielen Rubinisten verwendet.Quelle: Active Support Core Extensions (Rails Guides)
quelle
require 'active_support/core_ext/enumerable'
Bitte schön:
Weitere Informationen zu ähnlichen Techniken finden Sie im Ruby Style Guide .
quelle
if flag unless @players.include?(p.name)
ist umständlich undif flag && [email protected]?(p.name)
verwendet Negation.if
let nurtrue
den Zustand passieren,unless
passieren lässtfalse
undnil
. Dies führt manchmal zu schwer zu findenden Fehlern. Deshalb bevorzuge ichexclude?
Wie wäre es mit folgendem:
quelle
Nur Ruby betrachten:
TL; DR
Verwenden
none?
Sie==
zum Vergleich einen Block mit :Array#include?
akzeptiert ein Argument und==
prüft mit jedem Element im Array:Enumerable#none?
kann auch ein Argument akzeptieren, in welchem Fall es===
für den Vergleich verwendet wird. Um das gegenteilige Verhalten zu erreichen, lasseninclude?
wir den Parameter weg und übergeben ihm einen Block, der==
für den Vergleich verwendet wird.Im obigen Beispiel können wir tatsächlich verwenden:
Das liegt daran
Integer#==
undInteger#===
sind gleichwertig. Aber bedenken Sie:none?
kehrt zurück,false
weilInteger === 1 #=> true
. Aber wirklich eine legitimenotinclude?
Methode sollte zurückkehrentrue
. Also wie vorher:quelle
Ok, aber im Ernst, es sei denn, es funktioniert gut.
quelle
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
:quelle
Kannst du --- benutzen:
unless
ist das Gegenteil vonif
, oder Sie können verwendenreject
.Sie können
reject
die nicht benötigten Elemente:Nachdem Sie die Ergebnisse erhalten haben, können Sie Ihre Implementierung durchführen.
quelle
Die Verwendung von
unless
ist für Anweisungen mit einzelneninclude?
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 voninclude?
withexclude?
viel freundlicher.Aber wie dizzy42 oben sagt,
exclude?
erfordert die Verwendung von ActiveSupportquelle
Versuchen Sie so etwas:
quelle
Versuchen Sie dies, es ist reines Ruby, sodass keine peripheren Frameworks hinzugefügt werden müssen
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.
quelle
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:
quelle