lua に const キーワードはありますか? または他の同様のものはありますか?変数を const として定義し、変数の値が変更されないようにしたいためです。前もって感謝します。
4 に答える
Lua は定数を自動的にサポートしませんが、その機能を追加できます。たとえば、定数をテーブルに配置し、メタテーブルを使用してテーブルを読み取り専用にします。
これを行う方法は次のとおりです。http://andrejs-cainikovs.blogspot.se/2009/05/lua-constants.html
複雑なのは、定数の名前が単に「A」と「B」ではなく、「CONSTANTS.A」と「CONSTANTS.B」のようなものになることです。すべての定数を 1 つのテーブルに入れるか、複数のテーブルに論理的にグループ化するかを決めることができます。たとえば、数学定数の「MATH.E」や「MATH.PI」など。
すでに述べたようにconst
、Lua にはありません。
この小さな回避策を使用して、グローバルに定義された変数を「保護」できます (保護されたテーブルと比較して)。
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)
const
Lua や同様の構造にはキーワードはありません。
最も簡単な解決策は、コメントに大きな注意を書き、この変数への書き込みは禁止されていることを伝えることです...
ただし、グローバル環境(またはLua 5.2) にメタテーブルを提供することで、グローバル変数への書き込み (または読み取り) を禁止することは技術的に可能です。_G
_ENV
このようなもの:
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
と、エラーがスローされます。