Lua 表作为成员变量似乎总是为零
我是lua的新手,我试图理解他们的OOP方法。我有一个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,
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秒-