从lua存储userdata对象中的值

时间:2010-08-22 14:37:09

标签: lua

我想做的是:

object.foo = "bar"

print(object.foo)

其中“object”是用户数据。

我一直在谷歌搜索一段时间(使用关键字__newindex和lua_rawset),但我不能做任何我希望它做的事情。

我想用c ++中的lua api来做这个。

3 个答案:

答案 0 :(得分:3)

让我们用Lua代码编写它,以便我们可以使用代码进行快速实验

function create_object()
  -- ## Create new userdatum with a metatable
  local obj = newproxy(true)
  local store = {}
  getmetatable(obj).__index = store
  getmetatable(obj).__newindex = store
  return obj
end

ud = create_object()
ud.a = 10
print(ud.a)
-- prints '10'

如果您使用userdata,您可能希望使用C API执行上述操作。然而,Lua代码应该清楚地说明哪些步骤是必要的。 (newproxy(..)函数只是从Lua创建一个虚拟用户数据。)

答案 1 :(得分:1)

我放弃了尝试用C ++做这个,所以我在lua中做到了。我遍历所有元表(_R)并分配元方法。

_R.METAVALUES = {}

for key, meta in pairs(_R) do
    meta.__oldindex = meta.__oldindex or meta.__index

    function meta.__index(self, key)
        _R.METAVALUES[tostring(self)] = _R.METAVALUES[tostring(self)] or {}
        if _R.METAVALUES[tostring(self)][key] then
            return _R.METAVALUES[tostring(self)][key]
        end
        return meta.__oldindex(self, key)
    end

    function meta.__newindex(self, key, value)

        _R.METAVALUES[tostring(self)] = _R.METAVALUES[tostring(self)] or {}

        _R.METAVALUES[tostring(self)][key] = value
    end

    function meta:__gc()
        _R.METAVALUES[tostring(self)] = nil
    end
end

这个问题是我应该用于索引的问题。 tostring(self)仅适用于返回tostring的ID的对象。并非所有对象都具有诸如Vec3和Ang3之类的ID以及所有这些。

答案 2 :(得分:0)

你也可以使用一个简单的表......

config = { tooltype1 = "Tool",   
        tooltype2 = "HopperBin",   
        number = 5,
        }   

print(config.tooltype1) --"Tool"   
print(config.tooltype2) --"HopperBin"   
print(config.number) --5