2012-04-26 37 views
13

¿Cuál es la forma correcta de hacer un condicional que verificaciones de algo está o no está vacío en Lua? if x == "" y f x ~= "" parece que no funciona.¿Cómo comprobar si un valor está vacío en Lua?

+1

¿Cómo se define "vacío"? –

+0

significado vacío, no hay nada escrito en él. – Village

+2

No puede "escribir" valores en variables. ¿Puedes dar una definición más precisa? Porque una variable que contiene la cadena '" "' no está "vacía". Tiene una cuerda. A saber '" "'. Que es una cadena válida Y por lo tanto, nada. –

Respuesta

14

Lua es lenguaje basado en tipos dinámicamente.
Cualquier variable puede contener uno de los siguientes tipos: nil, boolean, número, cadena, tabla, función, hilo, o userdata.
Cualquier variable en una tabla (incluyendo _G, la tabla donde residen las globales) sin un valor da un valor de nil cuando se indexa. Cuando establece una variable de tabla en nil, esencialmente "lo declara" (eliminando por completo la entrada de la memoria).
Cuando se declara una variable local, si no se asigna inmediatamente, se le asigna un valor de nil. A diferencia de la variable de tabla, cuando establece una variable local en nil, no lo hace "undeclare" (solo tiene un valor de nil).

En Lua, una cadena vacía ("") sigue siendo un "valor" - es simplemente una cadena de tamaño cero.

+0

Creo que decir "_Cuando configura una variable en cero, esencialmente" declara "it_" es un poco inexacto — 'nil' es un valor verdadero excepto en las tablas, por ejemplo, una variable local con un valor' nil' todavía sombras variables en los ámbitos circundantes ... – snogglethorpe

+0

Tiene toda la razón; esa declaración estaba dirigida a pares de tablas, no a todas las variables en general. La respuesta ha sido modificada para reflejar esto. – Deco

+0

@snogglethorpe 'cuando fuera nulo entonces \t de impresión ("nula es verdad") demás \t de impresión ("nulo no es verdad!") end' -> nil no es verdad! – handle

1

Probablemente tenga espacios, líneas nuevas u otros caracteres no visibles en su cadena. Entonces piensas que está "vacío", pero no lo es. Esto generalmente ocurre cuando está tomando la información del usuario, y tiene que escribir "enter" para finalizar; la "enter" termina en la cadena.

Lo que necesita es una función que le indique si la cadena está "en blanco", ya sea vacía, o una lista de espacios/pestañas/líneas nuevas. He aquí una manera de hacerlo:

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

Uso:

if isBlank(x) then 
    -- ... 
end 
+2

eso es bastante ineficiente; 'not not string.find (x," ^% s * $ ")' – daurnimator

+0

Bueno, su versión es definitiva (una vez que incluye la llamada omitida de tostring). No estoy tan seguro de que sea significativamente más rápido. ¿Por qué piensas eso? – kikito

+0

'string.gsub' asignaría mucha memoria para esa operación (una nueva cadena que se redimensiona varias veces, uno o dos almacenamientos intermedios para reemplazos) en comparación con' string.find'. – Deco

3

Recientemente me encontré con este problema también. LuaSQL devolvía cadenas vacías si el valor de la base de datos estaba 'en blanco' (no nulo). Un enfoque raro, pero así es como lo resolví:

if (string.len(x) >= 1) then 
    ... 
end 
Cuestiones relacionadas