我试图了解他们的OOP方法 . 我有这个 WebServerClient
对象从连接到Web服务器的客户端接收套接字:
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
问题是,一旦客户端发送了一些数据,我就会收到错误:
PANIC:调用Lua API时出现无保护错误(WebServerClient.lua:20:尝试调用方法'insert'(零值))
所以,似乎 self.header
是 nil
,而我认为它应该是一个有效的表 . 在恐慌之前, test
被打印到控制台,所以我很确定 self
是正确启动的 . ( data
不是 nil
因为我可以打印它) .
我正在使用Lua 5.1 .
谁知道发生了什么?
1 回答
self.header
不是nil
值 .nil
的值是self.header:insert
.header
是一个表,但它是一个空表 . 因此,header.insert
是nil
.如果您尝试调用Lua标准函数
table.insert
,则无法通过实际表调用它 . 你必须像这样调用它table.insert(tbl, value)
,其中tbl
是你要插入的表 .表格不像字符串,您可以通过元方法从
string
库中调用函数 .