6

Lua から更新したい C の値がいくつかあり、独自のバインディング関数を作成しましたが、何か可能かどうか知りたいです。

これができるようになりたい

myNamespace.myValue = 10

これと同じことをさせます

myNamespace.setMyValue(10)

可能?ほとんど好奇心旺盛です。get/set 関数を呼び出す代わりに、値を直接割り当て/読み取る方がクリーンです。Lua はそのような自動翻訳を行うことができますか?

4

1 に答える 1

7

これは確かに可能です。メタメソッドをオーバーロードして__newindexmyValue を変換しsetMyValue、それをテーブルで呼び出すことができます。例:

local meta = {
    __newindex = function(t, key, value)
        local setterName = "set" .. key:sub(0, 1):upper() .. key:sub(2)
        local setter = t[setterName]
        if setter == nil then
            error("Setter " .. setterName .. " does not exist on table")
        end

        return setter(t, value)
    end
}

local table = {
    setMyValue = function(self, v)
        print("Set value to " .. tostring(v))
    end
}
setmetatable(table, meta)

table.myValue = "Hello"

これにより、「Set value to Hello」が出力されます。

同じことを行うために __index をオーバーロードすることgetMyValueもできます。

于 2013-10-31T09:08:41.423 に答える