表格作为成员变量似乎总是为空。

我是Lua的新手,正在尝试理解他们的面向对象编程方法。我有一个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”,而我认为它应该是一个有效的表格。在panic之前,将“测试”打印到控制台,因此我非常确定“ self”已正确初始化。 (我可以打印出“ data”,它不是“ nil”)。

我正在使用Lua 5.1。

任何人知道发生了什么吗?

点赞
用户734069
用户734069

self.header并不是引起问题的nil值。此处的nil值是self.header:insertheader是一个表,但是它是一个_空表_。因此,header.insert的值为nil

如果您想调用Lua标准函数table.insert,您不能通过实际表来调用它。您必须像这样调用table.insert(tbl, value),其中tbl是要插入的表。

表不像字符串,您无法通过元方法从string库中调用函数。

2016-01-17 18:59:32