Lua实现KVO

Lua元表使用 __index和__newindex方法有点类似get和set方法,可以利用这个特性实现监听table的属性变化。

  • table.key = value 只有在table中不存在该key时才会走元表的__newindex方法。
    可以对 Lua实现继承 中的Object做一层封装,返回一个空表,外界对这个空表的所有访问和设置都要通过元表的__index和__newindex方法,从而实现监听。
local Observable = Object:extend()

function Observable:new()
    Observable.super.new(self)
    return self:_observable()
end

function Observable:_observable()
    self.observKeys = {}
    self.__observable_table = setmetatable({}, {
        __index = self,
        __newindex = function(t, k, v)
            print("VALUE CHANGE~ "..k.."=== old(",self[k],") new(",v,")")
            
            local callback = self.observKeys[k]
            if type(callback) == "function" then
                callback(self[k], v)
            end
            
            self[k] = v
        end,
        __pairs = function (t) return pairs(self) end,
        __ipairs = function (t) return ipairs(self) end,
        __len = function (t) return #self end
    })

    return self.__observable_table
end

local a = Observable:new()
a.v2 = {}           -- VALUE CHANGE~ V2 === old( nil ) new( table:0x281ab19c0 )
a.v2 = "123"        -- VALUE CHANGE~ V2 === old( table:0x281ab19c0 ) new( 123 )

ps. 这里在new方法里返回了一个空表,用Observable:new()创建 而没有用__call,也可以将__call改造成new方法返回实例对象。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,755评论 0 38
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,884评论 0 17
  • 前言 元表对应的英文是metatable,元方法是metamethod。我们都知道,在C++中,两个类是无法直接相...
    胤醚貔貅阅读 4,619评论 0 2
  • 一年前毕业,找工作,上班,按部就班。 每个月的工资中等,但是越来越沉迷于买各种化妆品,想买这个包,那个包。小东西看...
    不会游泳的鱼lb阅读 1,558评论 0 1
  • 感赏昨晚自己肚子给自己买了烧烤,好幸福,一个人吃着肆无忌惮,美味的食物在口中,感赏,谢谢,谢谢 感赏对自己越来越好...
    丽清笑阅读 1,612评论 0 1

友情链接更多精彩内容