Проверить, если строка-это'т nil или пустой в Lua

Я'вэ некоторые в настоящее время некоторые Луа код, используя следующий синтаксис:

if (foo == nil or foo == '') then
    foo = "some default value"
end

Цель условие if, чтобы проверить Foo является ни пустой строкой, ни нулевую ценность.

Может ли этот код быть упрощена в одном, если вместо теста два?

Комментарии к вопросу (8)
Решение

Одна простая вещь вы можете сделать, это абстрактный тест внутри функции.

local function isempty(s)
  return s == nil or s == ''
end

if isempty(foo) then
  foo = "default value"
end
Комментарии (2)

этот код может быть упрощен в случае, если вместо теста два?

"ноль" и'' различные значения. Если вам нужно проверить что 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 (во всяком случае на моей машине), но разница мизерная. Я'd переход с первой на ясность'ы ради.

Комментарии (5)