34

lua に const キーワードはありますか? または他の同様のものはありますか?変数を const として定義し、変数の値が変更されないようにしたいためです。前もって感謝します。

4

4 に答える 4

19

Lua は定数を自動的にサポートしませが、その機能を追加できます。たとえば、定数をテーブルに配置し、メタテーブルを使用してテーブルを読み取り専用にします。

これを行う方法は次のとおりです。http://andrejs-cainikovs.blogspot.se/2009/05/lua-constants.html

複雑なのは、定数の名前が単に「A」と「B」ではなく、「CONSTANTS.A」と「CONSTANTS.B」のようなものになることです。すべての定数を 1 つのテーブルに入れるか、複数のテーブルに論理的にグループ化するかを決めることができます。たとえば、数学定数の「MATH.E」や「MATH.PI」など。

于 2012-09-11T11:44:14.263 に答える
5

すでに述べたように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)
于 2012-09-11T12:35:45.230 に答える
2

constLua や同様の構造にはキーワードはありません。

最も簡単な解決策は、コメントに大きな注意を書き、この変数への書き込みは禁止されていることを伝えることです...

ただし、グローバル環境(または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と、エラーがスローされます。

于 2012-09-11T11:47:18.820 に答える