Saat ini saya telah memiliki beberapa kode Lua menggunakan sintaks berikut:
if (foo == nil or foo == '') then
foo = "some default value"
end
Tujuan dari kondisi if adalah untuk menguji foo bukan string kosong, bukan nilai nihil.
Dapatkah kode ini disederhanakan dalam satu tes if, bukan dua?
Dapatkah kode ini disederhanakan dalam satu tes if, bukan dua?
nil
dan ''
adalah nilai yang berbeda. Jika Anda perlu menguji bahwa s
bukan keduanya, IMO Anda harus membandingkan keduanya, karena itu membuat maksud Anda menjadi lebih jelas.
Itu dan beberapa alternatif, dengan bytecode yang dihasilkan:
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
Yang kedua tercepat di Lua 5.1 dan 5.2 (di mesin saya), tetapi perbedaannya kecil. Saya akan memilih yang pertama demi kejelasan.