web-dev-qa-db-fra.com

Comment vérifier si une valeur est vide dans Lua?

Quelle est la bonne façon de faire une condition qui vérifie quelque chose est ou n'est pas vide dans Lua? if x == "" et f x ~= "" ne semble pas fonctionner.

17
Village

Lua est un langage basé sur un type dynamique.
Toute variable peut contenir l'un des types suivants: nil , booléen , nombre , chaîne , table , fonction , thread ou données utilisateur .
Toute variable dans une table (y compris _G, la table où résident les globaux) sans valeur donne une valeur de nil lors de l'indexation. Lorsque vous définissez une variable de table sur nil, elle la "déclare" essentiellement (en supprimant entièrement l'entrée de la mémoire).
Lorsqu'une variable local est déclarée, si elle n'est pas affectée immédiatement, elle reçoit la valeur nil. Contrairement à la variable de table, lorsque vous définissez une variable local sur nil, elle ne pas la "annule" (elle a juste une valeur de nil).

Dans Lua, une chaîne vide ("") est toujours une "valeur" - c'est simplement une chaîne de taille zéro.

18
Deco

J'ai récemment rencontré ce problème également. LuaSQL renvoyait des chaînes vides si une valeur de base de données était "vide" (non nulle). Une approche hacky, mais voici comment je l'ai résolu:

if (string.len(x) >= 1) then
    ...
end
3
When1ConsumeMem

Vous avez probablement des espaces, des sauts de ligne ou d'autres caractères non visibles dans votre chaîne. Vous pensez donc qu'il est "vide", mais ce n'est pas le cas. Cela se produit généralement lorsque vous prenez une entrée de l'utilisateur, et doit taper "enter" pour terminer - "enter" finit dans la chaîne.

Ce dont vous avez besoin est une fonction qui vous indique si la chaîne est "vide" - soit vide, soit une liste d'espaces/tabulations/sauts de ligne. Voici une façon de procéder:

function isBlank(x)
  return not not tostring(x):find("^%s*$")
end

Usage:

if isBlank(x) then
  -- ...
end
1
kikito