web-dev-qa-db-ja.com

Luaで文字列がnilでも空でもないかどうかを確認します

現在、次の構文を使用したLuaコードがいくつかあります。

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

If条件の目標は、fooをテストすることであり、空の文字列でも、nil値でもありません。

このコードは、テストを2つではなく1つに簡略化できますか?

33
Uskiver

簡単にできることの1つは、関数内のテストを抽象化することです。

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

if isempty(foo) then
  foo = "default value"
end
47
hugomg

このコードは、テストを2つではなく1つに簡略化できますか?

nilおよび''は異なる値です。 sがどちらでもないことをテストする必要がある場合、IMOは両方を比較する必要があります。これは意図が最も明確になるためです。

それと、生成されたバイトコードを使用したいくつかの選択肢:

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

2番目はLua 5.1および5.2(とにかく私のマシン上)で最速ですが、違いはわずかです。わかりやすくするために、最初に行きます。

12
Mud