2012-09-11 62 views

回答

11

Lua確實不是自動支持常量,但您可以添加該功能。例如,將常量放在一個表中,並使用metatable使表只讀。

這裏是如何做到這一點:http://andrejs-cainikovs.blogspot.se/2009/05/lua-constants.html

的複雜性在於,你的常量的名稱將不會僅僅是「A」和「B」,但像「CONSTANTS.A」和「CONSTANTS.B 」。您可以決定將所有常量放在一個表中,或者將它們邏輯分組到多個表中;例如數學常數的「MATH.E」和「MATH.PI」等。

+2

也http://lua-users.org/wiki/ReadOnlyTables見。並且請注意,您可以將'_ENV'和/或'_G'設置爲只讀表來模擬全局常量(在性能上需要付出一定代價)。 – finnw

+0

這似乎是@finnw發佈的鏈接中非常重要的一個註釋:「此外,這種創建只讀表的方法**會干擾對,ipairs,next,#操作符**以及其他形式的表迭代。「 – chris

2

Lua或類似結構中沒有const關鍵字。

最簡單的辦法是寫一個大的謹慎評論,告訴它禁止寫入該變量...

然而技術上是可行的禁止寫入(或讀出)一個全球通過爲全球環境_G(或Lua 5.2中的_ENV)提供metatable而變化。

事情是這樣的:

local readonly_vars = { foo=1, bar=1, baz=1 } 
setmetatable(_G, {__newindex=function(t, k, v) 
    assert(not readonly_vars[k], 'read only variable!') 
    rawset(t, k, v) 
end}) 

然後,如果你嘗試的東西分配給foo,拋出一個錯誤。

+0

此代碼不正確。它將防止設置新變量,但不會改變它們。 – ZzZombo

3

如前所述,Lua中沒有const

你可以使用這個小解決方法,以「保護」的全局變量(相對於保護表):

local protected = {} 
function protect(key, value) 
    if _G[key] then 
     protected[key] = _G[key] 
     _G[key] = nil 
    else 
     protected[key] = value 
    end 
end 

local meta = { 
    __index = protected, 
    __newindex = function(tbl, key, value) 
     if protected[key] then 
      error("attempting to overwrite constant " .. tostring(key) .. " to " .. tostring(value), 2) 
     end 
     rawset(tbl, key, value) 
    end 
} 

setmetatable(_G, meta) 

-- sample usage 
GLOBAL_A = 10 
protect("GLOBAL_A") 

GLOBAL_A = 5 
print(GLOBAL_A) 
相關問題