从Lua设置C属性

6

我有一些在C语言中的值,我想从Lua中更新它们,我已经编写了自己的绑定函数,但我想知道是否有可能实现以下功能:

我希望能够做到这一点:

myNamespace.myValue = 10

并且使它与这个做的事情相同

myNamespace.setMyValue(10)

可能吗?主要是好奇。直接分配/读取值比调用get/set函数更简洁。Lua能否进行自动翻译呢?

1个回答

7
这是完全可以实现的。你可以重载__newindex元方法,将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"

这将打印出"将值设置为Hello"。

您可能希望重载__index来使用getMyValue完成相同的操作。


2
这是根据OP的要求。为什么他想为每个变量编写setter而不是直接使用__newindex方法,我不知道。 - lhf
2
请注意,为了使其正常工作,“setMyValue”不应该写入“myNamespace.myValue”,而是应该写入一个私有表中。 “__index”元方法应该从该表中读取。 - lhf
太棒了!我觉得这完全是不可能的。Lua每天都变得更酷,谢谢你。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接