我正在编写一个“C”用户数据数组结构。作为 setter 和 getter,我想要正常的数组访问 (u[0] = 1 u[0]),就像这里讨论的那样: [c array share][1] Share Array between lua and C。为此,我需要将 __index 和 __newindex 设置为 set 并在 c 中获取函数。
另外,我也想要面向对象的访问,“就像 u:mymethod()”。我的麻烦是,我现在需要将 __index 设置为元表本身。
有没有办法实现两者?
我正在编写一个“C”用户数据数组结构。作为 setter 和 getter,我想要正常的数组访问 (u[0] = 1 u[0]),就像这里讨论的那样: [c array share][1] Share Array between lua and C。为此,我需要将 __index 和 __newindex 设置为 set 并在 c 中获取函数。
另外,我也想要面向对象的访问,“就像 u:mymethod()”。我的麻烦是,我现在需要将 __index 设置为元表本身。
有没有办法实现两者?
只是实现这一目标的众多可能方法之一:
local userdata = { _array = { "A", "B", "C" } }
local mt = { }
local methods = { }
function mt.__index(userdata, k)
if methods[k] then
return methods[k]
else
return rawget(userdata, "_array")[k]
end
end
function mt.__newindex(userdata, k, v)
if methods[k] then
error "can't assign to method!"
else
rawget(userdata, "_array")[k] = v
end
end
function methods.count(userdata)
return #rawget(userdata, "_array")
end
setmetatable(userdata, mt)
userdata[3] = "Z"
print(userdata[1])
print(userdata[2])
print(userdata[3])
print(userdata:count())
userdata.count = 0
编辑:正如 lhf 在他的评论中指出的那样,使用 metatable 并不危险,因为它是 __index 表,因为 c-methods 应该始终检查它们操作的 self 。