J'ai actuellement du code Lua en utilisant la syntaxe suivante:
if (foo == nil or foo == '') then
foo = "some default value"
end
Le but de la condition if est de tester foo n'est ni une chaîne vide, ni une valeur nulle.
Ce code peut-il être simplifié en un si test à la place de deux?
Une chose simple à faire est d’abréger le test dans une fonction.
local function isempty(s)
return s == nil or s == ''
end
if isempty(foo) then
foo = "default value"
end
Ce code peut-il être simplifié en un si test à la place de deux?
nil
et ''
sont différentes valeurs. Si vous devez vérifier que s
n'est ni l'un ni l'autre, il est préférable de comparer les deux, car votre objectif est plus clair.
Cela et quelques alternatives, avec leur bytecode généré:
if not foo or foo == '' then end
GETGLOBAL 0 -1 ; foo
TEST 0 0 0
JMP 3 ; to 7
GETGLOBAL 0 -1 ; foo
EQ 0 0 -2 ; - ""
JMP 0 ; to 7
if foo == nil or foo == '' then end
GETGLOBAL 0 -1 ; foo
EQ 1 0 -2 ; - nil
JMP 3 ; to 7
GETGLOBAL 0 -1 ; foo
EQ 0 0 -3 ; - ""
JMP 0 ; to 7
if (foo or '') == '' then end
GETGLOBAL 0 -1 ; foo
TEST 0 0 1
JMP 1 ; to 5
LOADK 0 -2 ; ""
EQ 0 0 -2 ; - ""
JMP 0 ; to 7
La seconde est la plus rapide en Lua 5.1 et 5.2 (de toute façon sur ma machine), mais la différence est minime. J'irais avec le premier pour plus de clarté.