2012-04-26 5 views
13

Каков правильный способ сделать условие, которое проверяет что-то или нет в Lua? if x == "" и f x ~= "", похоже, не работают.Как проверить, пусто ли в Lua?

+1

Как вы определяете "empty"? –

+0

Пустой смысл, в нем ничего нет. – Village

+2

Вы не можете «вводить» значения в переменные. Можете ли вы дать более точное определение? Поскольку переменная, содержащая строку '' '', не является пустой. Он имеет строку. А именно '' ''. Это допустимая строка. И поэтому ничего. –

ответ

14

Lua - это язык с динамическим языком.
Любые переменный может содержать один из следующих типов: ноля, булева, номер, строки, таблицы, функции, нити или UserData.
Любая переменная в таблице (включая _G, таблица, в которой находятся глобальные группы), без значения дает значение nil при индексировании. Когда вы устанавливаете переменную таблицы в nil, она существенно «ундекларирует» ее (полностью удаляя запись из памяти).
Если объявлена ​​переменная local, если она не назначена немедленно, ей присваивается значение nil. В отличие от переменной таблицы, когда вы устанавливаете переменную local в nil, она делает не «undeclare» (она просто имеет значение nil).

В Lua пустая строка ("") по-прежнему является «значением» - это просто строка с нулевым размером.

+0

Я думаю, что говорящий «_ Когда вы устанавливаете переменную в nil, она по существу« ундекларирует »it_» немного неточна — 'nil' - истинное значение, за исключением внутренних таблиц, так, например, локальная переменная со значением' nil' still тени в окружающих областях ... – snogglethorpe

+0

Вы абсолютно правы; это утверждение было нацелено на пары таблиц, а не вообще на переменные вообще. Ответ был изменен, чтобы отразить это. – Deco

+0

@snogglethorpe 'если ноль то \t печать ("ноль правда") еще \t печати ("ноль это не так!") end' -> ноль это не так! – handle

1

У вас, вероятно, есть пробелы, символы новой строки или другие невидимые символы в вашей строке. Поэтому вы думаете, что это «пусто», но это не так. Обычно это происходит, когда вы берете ввод от пользователя и набираете «enter» для завершения - «enter» заканчивается в строке.

Что вам нужно, это функция, которая сообщает вам, является ли строка пустой: либо пустой, либо список пробелов/вкладок/новых строк. Вот один из способов сделать это:

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

Использование:

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

это довольно неэффективно; 'not not string.find (x," ^% s * $ ")' – daurnimator

+0

Ну, ваша версия окончательно (как только вы включите пропущенный вызов tostring). Я не уверен, что это значительно быстрее. Почему вы так думаете? – kikito

+0

'string.gsub' выделял бы много памяти для этой операции (новая строка, которая несколько раз изменялась, один или два буфера для замещений) по сравнению с' string.find'. – Deco

3

Недавно я столкнулся с такой проблемой, как хорошо. LuaSQL возвращал пустые строки, если значение базы данных было «пусто» (но не null). Хакерный подход, но вот как я его решил:

if (string.len(x) >= 1) then 
    ... 
end 
Смежные вопросы