【问题标题】:not able to call methods after decoding from json从json解码后无法调用方法
【发布时间】:2011-05-14 01:28:52
【问题描述】:

我有一个像下面这样的 Lua 类。我正在使用 json 序列化对象并将其放入键值存储中。我能够序列化对象并将其成功放入键值存储中,但是在从键值存储中检索对象后,我无法调用该对象的任何方法。我知道 json 模块在编码时跳过了方法,而我的对象在解码后没有方法。

在我将对象从 json 解码到 lua 之后,有没有办法将方法附加到类?一些类似于 C 语言中的函数指针的东西。

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

【问题讨论】:

    标签: json lua


    【解决方案1】:

    Lua 中的函数是第一类对象,你可以将函数存储在任何变量中。线

    function self:add_put_ticket(ticketid)
    

    等价于

    self.add_put_ticket = function (self, ticketid)
    

    从那里开始,应该做什么就很明显了:在可访问的地方定义所需的方法,并在反序列化后将它们分配给适当的字段

    【讨论】:

      【解决方案2】:

      您可以使用元表来做到这一点。

      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"
      

      【讨论】:

        猜你喜欢
        • 2012-04-15
        • 1970-01-01
        • 2020-04-29
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 2017-05-12
        • 2022-12-30
        • 1970-01-01
        相关资源
        最近更新 更多