2016-08-02 19 views
2
local a = (true==true) and false or nil -- returns nil 
local a = (true==true) and true or nil -- returns true 
local a = (true==true) and not false or nil -- returns true 
local a = (true==true) and not true or nil -- returns nil 

Returns richtigen boolean zurückzukehren, wenn Wert true ist, aber nicht, wenn false. Warum?Lua, if-Anweisung Idiom nicht korrekte boolean

+0

[Programmierung in Lua: Logische Operatoren] (http://www.lua.org/pil/3.3.html) – Adam

+0

Synopsis: 'or' und' und' sind nicht 'boolean' Operatoren; Sie sind "Logische Operatoren". Sie benötigen keine booleschen Werte und müssen diese auch nicht zurückgeben. –

Antwort

5

Das boolesche Idiom funktioniert mit einer Abkürzungsevaluation (nur den zweiten Operanden bei Bedarf auswerten).

Wenn Sie die Ausdrücke mit explizitem Vorrang umschreiben können Sie sehen, warum Sie nil bekommen würden:

(true and false) or nil  => false or nil => nil 
(true and true) or nil  => true or nil => true 
(true and not false) or nil => true or nil => true 
(true and not true) or nil => false or nil => nil 

Der Logical Operators Abschnitt Programming in Lua erklären das Idiom:

Ein weiteres nützliches Idiom ist (a und b) oder c (oder einfach a und b oder c, weil und hat einen höheren Vorrang als oder), was dem C-Ausdruck

a? b: c

vorausgesetzt, dass b nicht falsch ist. Zum Beispiel können wir das Maximum von zwei Zahlen x und y mit einer Aussage wie

max = (x> y) und x oder y

Warum kann b nicht false sein wählen? Weil die Auswertung immer false zurückgibt.

1 > 0 and false --> false 
1 < 0 and false --> false