2016-01-17 3 views
0

Я новичок в lua, и я пытаюсь понять их подход к ООП. У меня есть этот WebServerClient объект, который получает сокет от клиента, который подключается к веб-серверу:Таблица в качестве переменной-члена, кажется, всегда равна нулю

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: unprotected error in call to Lua API (WebServerClient.lua:20: attempt to call method 'insert' (a nil value))

Так , кажется self.headernil, в то время как я думаю, что это должна быть действительная таблица. Перед паникой на консоль печатается test, поэтому я уверен, что self инициирован правильно. (data нет nil как могу распечатать).

Я использую Lua 5.1.

Кто-нибудь знает, что происходит?

ответ

2

self.header не является значением nil. Значение nil составляет self.header:insert. header - стол, но это пустой стол. Поэтому header.insert - nil.

Если вы пытались вызвать стандартную функцию Lua table.insert, вы не можете назвать это через фактическую таблицу. Вы должны называть это следующим образом: table.insert(tbl, value), где tbl - это таблица, которую вы хотите вставить.

Таблицы не похожи на строки, где вы можете вызывать функции из библиотеки string через метаметоды.

+0

ах, я понимаю. В качестве эксперимента я инициализировал 'header' следующим образом:' header = setmetatable ({}, {__index = table}), ', тогда я могу назвать его как' self.header: insert (data) ', или вы думаете Это плохая идея? –

+0

@WouterHuysentruit: Это * ужасная идея. Просто вызовите функцию правильно. –

+0

ОК, я возьму ваше слово –

 Смежные вопросы

  • Нет связанных вопросов^_^