не в состоянии вызывать методы после декодирования из JSON - PullRequest
2 голосов
/ 13 мая 2011

У меня есть класс Lua, как показано ниже.Я использую json для сериализации объекта и помещения его в хранилище значений ключей.Я могу сериализовать объект и успешно поместить его в хранилище значений ключей, но не могу вызвать какие-либо методы объекта после извлечения объекта из хранилища значений ключей.Я понимаю, что модуль json пропускает методы при кодировании, и у моего объекта нет методов после декодирования.

Есть ли способ добавить методы в класс после того, как я декодирую объект из json в lua?что-то похожее на указатели на функции в языке Си.

local class_name = "user_object";
user_object = {};  --user class 


function user_object.new (mobile, password, uid)

        local self = {};
        self.mobile = mobile;
        self.uid    = uid; -- generate a uid which is a running number.
        self.password = password;
        self.messages_sent = 0;
        self.put_request_count = 0;
        self.get_request_count = 0;
        self.last_time_active = "";
        self.get_tickets = {};
        self.put_tickets = {};
        self.group_message_stream = {};
        self.group_ownerships = {}; -- group names which he is owner of 
        self.group_memberships = {}; -- group names  which he is member of 
        self.sent_poke_count = 0;
        self.sent_poke_stream = {};
        self.recv_poke_count = 0;
        self.recv_poke_stream = {};

        function self:add_put_ticket(ticketid)
                table.insert(self.put_tickets, ticketid);
                self:incr_put_count();
                self:save();
                return;
        end 

        function self:add_get_ticket(ticketid)
                table.insert(self.get_tickets, ticketid);
                self:incr_get_count();
                self:save();
                return;
        end

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Функции в Lua - это объекты первого класса, вы можете сохранить функцию в любой переменной. Линия

function self:add_put_ticket(ticketid)

эквивалентно

self.add_put_ticket = function (self, ticketid)

Оттуда должно быть очевидно, что делать: определите нужные методы, где они доступны, и назначьте их соответствующим полям после десериализации.

2 голосов
/ 13 мая 2011

Вы можете сделать это с метатаблицами.

user = { name = 'ponzao' } -- Just a table with values.
User = {}                  -- Table containing the functions.
function User:allCapsName() return self.name:upper() end -- A method.
setmetatable(user, {__index = User}) -- For unavailable keys all calls are dispatched to User.
print(user:allCapsName()) --> "PONZAO"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...