Ответ 1
Одна простая вещь, которую вы можете сделать, - это абстрагировать тест внутри функции.
local function isempty(s)
return s == nil or s == ''
end
if isempty(foo) then
foo = "default value"
end
В настоящее время у меня есть некоторый код Lua, используя следующий синтаксис:
if (foo == nil or foo == '') then
foo = "some default value"
end
Цель условия if - проверить foo - это не пустая строка, ни значение nil.
Можно ли упростить этот код в одном, если вместо двух тестов?
Одна простая вещь, которую вы можете сделать, - это абстрагировать тест внутри функции.
local function isempty(s)
return s == nil or s == ''
end
if isempty(foo) then
foo = "default value"
end
Можно ли упростить этот код в одном, если вместо двух тестов?
nil
и ''
- разные значения. Если вам нужно проверить, что s
нет, ИМО вы должны просто сравнить с обоими, потому что это делает ваше намерение наиболее ясным.
Это и несколько альтернатив с их созданным байт-кодом:
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
Второй самый быстрый в Lua 5.1 и 5.2 (на моей машине в любом случае), но разница крошечная. Я пошлю первым ради ясности.