2010-03-04 17 views
6

Mögliche Duplizieren:
Ruby: difference between || and ‘or’Ruby: Was ist der Unterschied zwischen den Vergleichen: "||" und "oder"

mit Ruby

|| 

und

or 

sind sehr häufig prac Dies macht es wichtig, den Unterschied zwischen den beiden zu kennen, da ich mir leider nicht sicher bin.

Zunächst einmal meine Frage ist, ob die folgende Annahme korrekt ist:

EX1:

if @variable_1 || @variable_2 || @variable_3 
    do something 
else 
    do nothing 
end 

EX2:

if @variable_1 or @variable_2 or @variable_3 
    do something 
else 
    do nothing 
end 

So im ersten Beispiel, wenn eine Variable falsch ist dann es wird ausgeführt "nichts tun"

Allerdings für das zweite Beispiel alle Vari Fähigkeiten werden überprüft und wenn einer wahr ist, wird es "etwas tun" ausführen.

Zusammenfassend verwenden Sie "||" Wenn Sie eine Liste von Variablen haben, die überprüft werden müssen, und wenn einer von ihnen false zurückgibt, wird ein Flag ausgelöst. Verwenden Sie das zweite Beispiel mit einer Liste von Variablen, bei denen nur eine wahr sein muss, um den gewünschten Code weiter auszuführen.

Sind diese Annahmen richtig?

+0

Genaues Duplikat von http://StackOverflow.Com/questions/2083112/ und http://StackOverflow.Com/questions/1625946/. Semantisch äquivalent zu http://StackOverflow.Com/questions/1426826/ und http://StackOverflow.Com/questions/1840488/. Auch (etwas) beantwortet in http://StackOverflow.Com/questions/1434842/. Ernst? Was für welterschütternde Veränderungen in der Ruby Language hat es in den letzten 6 Wochen gegeben, dass diese Frage immer wieder und wieder und wieder beantwortet werden muss? –

+0

@ Jörg: Ich würde erwarten, dass SO Stammgäste wissen, dass es schon einmal gefragt wurde, aber ich bin nicht überrascht, dass ein Neuling die damit verbundenen Fragen nicht googlen kann. –

Antwort

14

oder das zweite Beispiel werden alle Variablen überprüft und wenn einer wahr ist, wird es "etwas tun" ausführen.

Dies ist ein falscher Satz.

Als Ergebnis sind Ihre Annahmen nicht korrekt.

Sowohl or als auch || machen dasselbe.

Der Hauptunterschied ist, dass or niedrigere Priorität als || hat. So sollten Sie die Aufmerksamkeit auf komplexere Auswertungen zahlen:

# Simple cases are not confusing 
false || true # true 
false or true # true 

# This is more complex 
a = false || true # a=true 
a = false or true # a=false 

# Also similarly as 1 + 2*3 returns 7, the following returns true: 
false or false||true # true 
# BUT! THIS IS IMPORTANT! 
a = false or false||true # a=false 
a = (false or false||true) # a=true 

Hier ist eine Liste von operators precedence.

So ist der wirkliche Unterschied wird bemerkt werden, wenn Sie den Ausdruck, die eine der folgenden Operatoren enthalten:

  • .. ... - Range (inklusive und exklusive)
  • ? : - Ternary if-then-else
  • = %= { /= -= += |= &= >>= <<= *= &&= ||= **= - Zuordnung
  • defined? - Überprüfen Sie, ob angegebene Symbol
  • not definiert - Logische Negation
  • and - Logische Zusammensetzung

es könnte auch andere sein.

Sie können etwas über den Unterschied zwischen denen, wie unterschiedlich zwischen + und *: || == * und or = +. Gleiches gilt für and und not.

Sie sollten wirklich darauf achten.

Persönlich bevorzuge ich || Operator als seine Semantik ist gut verstanden und vermeiden or.

Während es "fühlt" wie or ist freundlicher in vielen Fällen (siehe mein Codebeispiel), auch in trivialen, es ist eine Quelle von Fehlern.

+0

Ihre Antwort ist viel besser als meine! Ich würde hinzufügen für die Nicht-Rubyists (und Nicht-Perl..ers?), Dass "oder" wird hauptsächlich in Situationen wie verwendet: 'x = get_some_string oder" "'. In dieser Situation könnte "get_some_string" nil oder einen anderen 'falsy' Wert zurückgeben und x würde zur leeren Zeichenkette werden. Wie Dmitriy sagt, "||" funktioniert auch hier sehr gut, es ist nur eine Konvention, die Sie gelegentlich in der Ruby-Welt sehen werden (wahrscheinlich ist dies eine Übertragung von Perl). – rfunduk

+0

@thenduks: "x würde die leere Zeichenfolge werden" Nein, würde es nicht. Wenn Sie "x = nil" oder "" eingeben, wird x "nil", nicht "" ". '" "ist einfach der zurückgegebene Wert des Ausdrucks. – sepp2k

+0

Hmm ganz richtig, '=' bindet enger als 'oder' tut ...Mein Beispiel war dann arm. – rfunduk

4

Sie tun das Gleiche, aber or hat eine niedrigere Priorität als || (und in der Tat, or hat eine niedrigere Priorität als die meisten anderen Betreiber).

+0

Sie tun nicht das Gleiche, weil der gleiche Code-Block eine andere Ausgabe rendern wird. – s84

+0

Was meinst du mit niedrigerer Priorität? – s84

+1

Vorrang definiert die Reihenfolge der Vorgänge. Zum Beispiel hat '*' eine höhere Priorität als '+', so dass der Ausdruck '1 + 2 * 3'' 7' zurückgibt, weil die Multiplikation zuerst ausgeführt wird. – mipadi

1

Ihre Schlussfolgerungen zu den Beispielen sind falsch.

if true || true || false 
    puts 'something' 
else 
    puts 'nothing' 
end 

Dieser Code gibt 'etwas' aus, weil so die 'logische' Operation funktioniert. Es liest sich wie "wenn mindestens eine von Bedingung1 oder Bedingung2 oder Bedingung3 wahr ist ...".

Das zweite Beispiel ist genau das gleiche, aber nur wegen der rules of precedence in Ruby.

Verwandte Themen