2012-04-04 5 views
2

Ich frage mich nur, wo diese Syntax dokumentiert:Zustand || erhöhen ("error")

1 > 2 || raise("error") 

Ich benutze es als Bedingung versucht haben:

1 > 2 || p "test" 

aber es funktioniert nicht:

SyntaxError: (irb):9: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' 
1 > 2 || p "test" 
      ^
     from C:/Ruby193/bin/irb:12:in `<main>' 
+0

Was meinst du mit "funktioniert nicht"? Was passiert und was erwartest du? –

+0

Ich habe meine Frage aktualisiert. – demas

+0

1> 2 || raise "error" funktioniert nicht – Falcon

Antwort

7

Was haben Sie funktioniert nicht, weil Sie Klammer benötigen:

1 > 2 || p("test") 

Beachten Sie, dass or (and and) has a different precedence than &&/|| und damit ohne Klammer funktioniert (und mit dem, was Sie tun mehr semantischen Sinn macht):

1 > 2 or p "test" 

ebenso wie unless:

p "test" unless 1 > 2 
5

Es ist nur ein Inline-Weg zu sagen "einen Fehler auslösen, wenn die Bedingung falsch ist". Die || ist nur ein üblicher OR-Operator, und der Ausdruck wird unter Verwendung von short-circuit evaluation ausgewertet. Dennoch aus Gründen der Übersichtlichkeit, ich würde das lieber:

raise("error") unless 1 > 2 
4

Beide Ausführungen funktionieren, das Problem ist der Ausschluss von Klammern auf die p. Das Ausführen des Codes von IRB:

ruby-1.8.7-p302 :003 > 1 > 2 || raise("error") 
RuntimeError: error 
    from (irb):3 

Durch die Zugabe von ( "test" ), arbeitet der Anruf als erwartet:

ruby-1.8.7-p302 :004 > 1 > 2 || p("test") 
"test" 
0

Was Sie versuchen, hier zu tun ist Kontrolle Fluss statt bedingte Logik. Es ist eine ungültige Syntax für bedingte Logik. Ein korrekter Kontrollfluss verwendet die Konstrukte "and" und "or". Dafür sind sie da und nicht, wie oft fälschlicherweise angenommen, syntaktischer Zuckerersatz für & & und || bedingte Operatoren. Sie sind unterschiedlich, haben eine unterschiedliche Rangfolge der Bewertung und sollten an der richtigen Stelle verwendet werden. Beispiele:

1 > 2 or p 'no it is not' 
2 > 1 and return 
instance.exists? or not_found! 
instance && instance.success? or raise FailureException, 'missing or unsuccessful' 

Wesentlichen, wenn Sie versuchen, aus der Aussage wahr oder falsch zu lesen, verwenden & & und ||. Wenn Sie versuchen, einen Codepfad basierend auf einer bedingten Auswertung auszuführen, verwenden Sie und und oder.