Die Verwendung von 'oder' ist gefährlich. 'oder' hat eine geringere Operatorpräsenz als '=', daher hat Folgendes unerwartetes Verhalten: a = falsch oder wahr #a ist nach dieser Aussage falsch
Tom G
20
@xiy derzeit empfiehlt der Leitfaden vorzutäuschen oder und und existieren nicht (|| ist das oder && und?)
user3125280
67
Aktueller "Ruby Style Guide" steht The and and or keywords are banned. It's just not worth it. Always use && and || instead.. Und es ist richtig, aus Gründen von David und Tom.
Andre Figueiredo
40
classObjectdef nil_zero?self.nil?||self==0endend# which lets you donil.nil_zero?# returns true0.nil_zero?# returns true1.nil_zero?# returns false"a".nil_zero?# returns falseunless discount.nil_zero?# do stuff...end
Hüten Sie sich vor den üblichen Haftungsausschlüssen ... große Macht / Verantwortung, Affenflicken, die zur dunklen Seite führen usw.
Beachten Sie, dass dies eine schienenspezifische Antwort ist. Vanille Rubin hat keine tryMethode.
Tom Lord
Richtig. Obwohl es eher ActiveSupport-spezifisch ist, ist es eine viel leichtere und weit verbreitete Abhängigkeit als die vollen Schienen. Wie auch immer, jetzt ist die Antwort von @ ndn die richtige.
Umgeschrieben am
Bearbeitet, um sichere Navigation zu verwenden
umgeschrieben am
1
Die Antwort dupliziert jetzt stackoverflow.com/a/34819818/1954610 ... Ich denke, es ist trysinnvoll, sie zu belassen, um die alternative Option anzuzeigen (aus diesem Grund wurde sie an erster Stelle positiv bewertet!), Solange dies klar ist der Leser, der ActiveSupportnicht Vanille Rubin ist.
Tom Lord
Punkt genommen, Antwort zurückgerollt.
umgeschrieben am
27
es sei denn [nil, 0] .include? (Rabatt)
# ...
Ende
Ich finde das perfekt lesbar und würde es einer neuen Klasse vorziehen. Gut gemacht.
Colincr
Der rubyistischste Ansatz, mit zwei Bedingungen umzugehen.
Yugendran
23
Ab Ruby 2.3.0 können Sie den sicheren Navigationsoperator ( &.) mit kombinieren Numeric#nonzero?. &.Gibt zurück, nilwenn die Instanz war nilund nonzero?- wenn die Nummer war 0:
"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String.... Dies ist nicht sicher für beliebige Objekte.
Tom Lord
2
@TomLord, wie im vorherigen Kommentar angegeben, sollte dies nicht mit beliebigen Objekten funktionieren. Stattdessen geht es um den Fall, dass Sie etwas haben, von dem Sie wissen, dass es eine Zahl sein sollte, aber möglicherweise auch nil.
ndnenkov
Ich würde diese Tatsache in der Antwort klarstellen, anstatt dass jemand dies überfliegt und den Haftungsausschluss in den Kommentaren nicht entdeckt.
Tom Lord
@ TomLord, es wird in der Antwort " nonzero?- wenn die Nummer war 0" angegeben . Auch die Notwendigkeit zu prüfen, ob ein völlig beliebiges Objekt 0vorliegt, tritt im Vergleich zu dem, was eine Zahl sein kann oder nicht, äußerst selten auf nil. Daher ist es fast impliziert. Selbst wenn jemand irgendwie die gegenteilige Annahme macht, wird er sofort verstehen, was passiert, wenn er versucht, es auszuführen.
Die Reihenfolge ist hier wichtig, denn wenn discountja nil, dann hat es keine zero?Methode. Die Kurzschlussbewertung von Ruby sollte jedoch verhindern, dass versucht wird, eine Bewertung discount.zero?vorzunehmen, wenn dies der Fall discountist nil.
Ist das nicht dasselbe wie die Antwort von @ oivoodo?
Cary Swoveland
Funktioniert nicht für beliebige Objekte . "".to_i == "foo".to_i == "0".to_i == 0. Ihre Methode macht alle Arten von unbeabsichtigten Zwängen. Es wird auch mit einem NoMethodErrorif fehlschlagen, auf discountdas nicht reagiert wird to_i.
Tom Lord
2
def is_nil_and_zero(data)
data.blank?|| data ==0end
Wenn wir "" bestehen, wird false zurückgegeben, während leer? gibt true zurück. Gleiches gilt für data = false blank? Gibt true für nil, false, empty oder eine Leerzeichenfolge zurück. Also ist es besser, leer zu verwenden? Methode, um auch leere Zeichenfolgen zu vermeiden.
Sie können den Rabatt auf 0 initialisieren, solange Ihr Code garantiert nicht versucht, ihn zu verwenden, bevor er initialisiert wird. Das würde einen Scheck entfernen, ich denke, ich kann mir nichts anderes vorstellen.
Ich glaube, das Folgende ist gut genug für Ruby-Code. Ich glaube nicht, dass ich einen Unit-Test schreiben könnte, der einen Unterschied zwischen diesem und dem Original zeigt.
discount
es falsch ist?discount.in? [0, nil]
der sauberere Weg ist möglichAntworten:
quelle
The and and or keywords are banned. It's just not worth it. Always use && and || instead.
. Und es ist richtig, aus Gründen von David und Tom.Hüten Sie sich vor den üblichen Haftungsausschlüssen ... große Macht / Verantwortung, Affenflicken, die zur dunklen Seite führen usw.
quelle
ok, nachdem 5 Jahre vergangen sind ....
Es ist wichtig zu beachten, dass dies
try
im ActiveSupport-Juwel definiert ist, sodass es nicht in einfachem Rubin verfügbar ist.quelle
try
Methode.try
sinnvoll, sie zu belassen, um die alternative Option anzuzeigen (aus diesem Grund wurde sie an erster Stelle positiv bewertet!), Solange dies klar ist der Leser, derActiveSupport
nicht Vanille Rubin ist.quelle
Ab Ruby 2.3.0 können Sie den sicheren Navigationsoperator (
&.
) mit kombinierenNumeric#nonzero?
.&.
Gibt zurück,nil
wenn die Instanz warnil
undnonzero?
- wenn die Nummer war0
:Oder Postfix:
quelle
"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String
.... Dies ist nicht sicher für beliebige Objekte.nil
.nonzero?
- wenn die Nummer war0
" angegeben . Auch die Notwendigkeit zu prüfen, ob ein völlig beliebiges Objekt0
vorliegt, tritt im Vergleich zu dem, was eine Zahl sein kann oder nicht, äußerst selten aufnil
. Daher ist es fast impliziert. Selbst wenn jemand irgendwie die gegenteilige Annahme macht, wird er sofort verstehen, was passiert, wenn er versucht, es auszuführen.quelle
Sie könnten dies tun:
Die Reihenfolge ist hier wichtig, denn wenn
discount
janil
, dann hat es keinezero?
Methode. Die Kurzschlussbewertung von Ruby sollte jedoch verhindern, dass versucht wird, eine Bewertungdiscount.zero?
vorzunehmen, wenn dies der Falldiscount
istnil
.quelle
Sie können Ihre leere Zeile in einen ganzzahligen Wert konvertieren und Null prüfen.
quelle
Update wird es
false
fürdiscount = false
quelle
Sie können die
NilClass
bereitgestellte#to_i
Methode nutzen, die fürnil
Werte Null zurückgibt:Wenn es
discount
sich um Bruchzahlen handeln kann, können Sie#to_f
stattdessen verwenden, um zu verhindern, dass die Zahl auf Null gerundet wird.quelle
"".to_i == "foo".to_i == "0".to_i == 0
. Ihre Methode macht alle Arten von unbeabsichtigten Zwängen. Es wird auch mit einemNoMethodError
if fehlschlagen, aufdiscount
das nicht reagiert wirdto_i
.Wenn wir "" bestehen, wird false zurückgegeben, während leer? gibt true zurück. Gleiches gilt für data = false blank? Gibt true für nil, false, empty oder eine Leerzeichenfolge zurück. Also ist es besser, leer zu verwenden? Methode, um auch leere Zeichenfolgen zu vermeiden.
quelle
blank?
ist eine schienenspezifische Methode und nicht in Vanille-Rubin erhältlich.Wenn ich mich mit einem Datenbankeintrag befasse , möchte ich alle leeren Werte mit dem Migrationshelfer mit 0 initialisieren:
quelle
Sie können den Rabatt auf 0 initialisieren, solange Ihr Code garantiert nicht versucht, ihn zu verwenden, bevor er initialisiert wird. Das würde einen Scheck entfernen, ich denke, ich kann mir nichts anderes vorstellen.
quelle
quelle
Ich bevorzuge einen saubereren Ansatz:
val.to_i
gibt a zurück,0
wenn val a istnil
,Danach müssen wir nur noch prüfen, ob der Endwert Null ist .
quelle
Eine alternative Lösung besteht darin, Verfeinerungen wie folgt zu verwenden:
quelle
Ich glaube, das Folgende ist gut genug für Ruby-Code. Ich glaube nicht, dass ich einen Unit-Test schreiben könnte, der einen Unterschied zwischen diesem und dem Original zeigt.
quelle
true
ob Rabatt wärenil
.