Lua用户数据,可使用数组访问和面向对象访问?

我正在编写一个"C"用户数据数组结构。作为setter和getter,我希望像在这里讨论的那样进行正常的数组访问(u[0] = 1 u[0]):[c array share] 在lua和C之间共享数组。为此,我需要将__index和__newindex设置为在c中设置的set和get函数。

此外,我也想要面向对象的访问,例如"u:mymethod()"。我的问题是,我现在需要将__index设置为元表本身。

有办法同时实现两者吗?

点赞
用户88888888
用户88888888

以下是实现此目标的许多可能方法之一:

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 "无法分配给方法!"
    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在他的评论中指出的那样,将元表用作__index表根本不危险,因为c方法应始终检查他们操作的self。

2013-05-01 16:06:27