web-dev-qa-db-fra.com

Vérifiez si une chaîne n'est pas nulle ou vide dans Lua

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?

33
Uskiver

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
47
hugomg

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é.

12
Mud