从Lua设置C属性

Dan*_*Dan 6 c c++ lua

我在C中有一些值,我想从Lua更新,我已经编写了自己的绑定函数,但我想知道是否有可能.

我希望能够做到这一点

myNamespace.myValue = 10
Run Code Online (Sandbox Code Playgroud)

让它做同样的事情

myNamespace.setMyValue(10)
Run Code Online (Sandbox Code Playgroud)

可能?只是很好奇.直接分配/读取值而不是调用get/set函数更简洁.Lua可以做那样的自动翻译吗?

Ham*_*son 7

这当然是可能的.您可以重载__newindexmetamethod以将myValue转换为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"
Run Code Online (Sandbox Code Playgroud)

这将打印"将值设置为Hello".

您可能希望重载__index以执行相同操作,但getMyValue也可以.

  • 这是根据OP请求.为什么他想为每个变量编写setter而不是直接使用`__newindex`方法我不知道. (2认同)
  • 请注意,要使其工作,`setMyValue`不应写入`myNamespace.myValue`,而应写入私有表.`__index`元方法应该从该表中读取. (2认同)