Lua 表作为成员变量似乎总是为零

Lua 表作为成员变量似乎总是为零,lua,lua-table,Lua,Lua Table,我是lua的新手,我试图理解他们的OOP方法。我有一个WebServerClient对象,它从连接到webserver的客户端接收套接字: WebServerClient = {} local WebServerClient_mt = { __index = WebServerClient } function WebServerClient:Create(socket) local self = setmetatable({ socket = socket,

我是lua的新手,我试图理解他们的OOP方法。我有一个
WebServerClient
对象,它从连接到webserver的客户端接收套接字:

WebServerClient = {}
local WebServerClient_mt = { __index = WebServerClient }

function WebServerClient:Create(socket)
    local self = setmetatable({
        socket = socket,
        buffer = "test",
        header = {},
    }, WebServerClient_mt)
    socket:on("receive", function(socket, data)
        print(self.buffer)
        self.header:insert(data) -- PANIC happens on this line!
        self:onData(data)
    end)
    return self
end
问题是,一旦客户端发送了一些数据,我就会得到错误:

恐慌:调用LuaAPI时出现未受保护的错误(WebServerClient.Lua:20:尝试调用方法“insert”(一个nil值))

因此,它看起来像是
self.header
nil
,而我认为它应该是一个有效的表。在死机之前,
test
被打印到控制台上,因此我非常确定
self
正确启动。(
data
不是
nil
,因为我可以打印它)

我用的是Lua5.1


有人知道发生了什么吗?

self.header
不是所讨论的
nil
值。
nil
值为
self.header:insert
header
是一个表,但它是一个空表。因此,
header.insert
nil

如果您试图调用Lua标准函数
table.insert
,则无法通过实际的表调用该函数。您必须像这样调用它
table.insert(tbl,value)
,其中
tbl
是您要插入的表


表与字符串不同,您可以通过元方法从
string
库调用函数。

self.header
不是所讨论的
nil
值。
nil
值为
self.header:insert
header
是一个表,但它是一个空表。因此,
header.insert
nil

如果您试图调用Lua标准函数
table.insert
,则无法通过实际的表调用该函数。您必须像这样调用它
table.insert(tbl,value)
,其中
tbl
是您要插入的表


表不像字符串,你可以通过元方法从
string
库调用函数。

啊,我明白了。作为一个实验,我初始化了
header
如下:
header=setmetatable({},{uuu index=table}),
,然后我可以像
self.header:insert(data)
,或者你认为这是个坏主意吗?@WouterHuysentruit:这是个糟糕的主意。按正确的方式调用函数。@Nicol我知道这是个坏主意,但纯粹出于好奇,效率损失有多大?@warspyking根据一位朋友制作的一个小基准测试,在lua 5.3上,似乎在一百万次迭代中,几乎可以达到0.1秒-啊,我理解。作为一个实验,我初始化了
header
如下:
header=setmetatable({},{uuu index=table}),
,然后我可以像
self.header:insert(data)
,或者你认为这是个坏主意吗?@WouterHuysentruit:这是个糟糕的主意。按正确的方式调用函数。@Nicol我知道这是个坏主意,但纯粹出于好奇,效率损失有多大?@warspyking根据一位朋友制作的一个小基准测试,在lua 5.3上进行一百万次迭代后,几乎可以达到0.1秒-