美文网首页
Lua实现KVO

Lua实现KVO

作者: 正谦 | 来源:发表于2019-10-08 11:13 被阅读0次

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方法返回实例对象。

相关文章

  • Lua实现KVO

    Lua元表使用 __index和__newindex方法有点类似get和set方法,可以利用这个特性实现监听tab...

  • 可能碰到的iOS笔试面试题(7)--KVO-KVC

    KVC-KVO KVC的底层实现? KVO的底层实现? 什么是KVO和KVC? KVO的缺陷? KVO是一个对象能...

  • JS函数charCodeAt的Lua实现

    JS函数charCodeAt的Lua实现 charCodeAt by Lua @(Lua JavaScript ...

  • iOS KVO

    KVO 示例 KVO的实现原理

  • iOS探索KVO实现原理,重写KVO

    写响应式编程博客时,提到了KVO,今天我们探索一下KVO的实现原理及如何自己实现KVO功能 首先简单的KVO实现 ...

  • iOS - KVO

    [toc] 参考 KVO KVC 【 iOS--KVO的实现原理与具体应用 】 【 IOS-详解KVO底层实现 】...

  • iOS原理篇(一): KVO实现原理

    KVO实现原理 什么是 KVO KVO 基本使用 KVO 的本质 总结 一 、 什么是KVO KVO(Key-Va...

  • iOS 自定义KVO

    自己实现kvo之前,需要知道iOS系统对kvo的实现。 系统实现kvo的原理 这依赖了OC强大的runtime特性...

  • iOS面试题(4) KVO KVC

    声明,不是原创,笔记均来自 群主大神~ 手动实现KVO 什么是KVO和KVC? KVO内部实现原理 NSNotif...

  • Lua与C#的交互实现

    lua与C#交互使用LuaInterface实现定义变量:1,Lua lua = new Lua() --定义一个...

网友评论

      本文标题:Lua实现KVO

      本文链接:https://www.haomeiwen.com/subject/dnvmyctx.html