2013-10-29 28 views
27

爲零或空我使用下面的語法已經有的一些目前Lua代碼,既不是零值。檢查一個字符串是不是在Lua

如果測試而不是兩個,這個代碼可以簡化爲一個嗎?

+0

那麼,你在測試什麼foo,bar或foo.bar?如果你有'foo.bar',你可以使用'local function test(foo,bar){if(foo.bar == nil或foo.bar =='')then foo.bar =「一些默認值「結束」,這將做的伎倆。 – Kamiccolo

+0

foo = foo或「某個默認值」 –

+0

假設你不希望foo'false'來計算你可以使用if(not foo)或者(foo =='')then ...',否則這就是儘可能短。 –

回答

38

你可以做的一件簡單的事情是在一個函數內抽象測試。

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

if isempty(foo) then 
    foo = "default value" 
end 
+0

如果s的長度大於0,那麼你如何計算?例如:foo長度爲2 – YumYumYum

+1

您可以使用'string.len'函數。但要檢查它是否大於零,做〜='''也是可行的。 – hugomg

9

可以的,如果測試而不是兩個這種代碼在一個簡化?

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 

二是最快的在Lua 5.1和5.2(我的機器上是這樣),但差別很小。爲了清晰起見,我會與第一個一起去。

+4

當'foo'爲'false'時,第一個和第三個不會做與第二個相同的事情。 – catwell

+0

如何使用'#foo == 0'來檢查空字符串而不是'foo ==''' - 它有沒有更快的機會? –

+3

這不是一個壞主意。 Lua字符串在內部保持其長度,因此您不必計數字符。但是Lua也實習字符串,因此檢查平等並不需要看字符;你只需檢查對象是否相同。所以這兩個*應該是快的,但是事實證明,檢索字符串長度的代碼路徑比代碼路徑稍微長一些,以便從VM堆棧中獲取兩個對象指針來比較它們,因此'#foo == 0'是在5.1和5.2以及5.3(由我的機器上的基準測定)中慢一點比'foo =='''慢一點。 – Mud

相關問題