Lua 学习笔记(metatable 与 meatmethod)

Lua中每一个值都有一套预定义的操作集合。

table和userdate可以有个字独立的元表,而其他类型的值则共享其类型所属的单一元素。

可以用 getmetatable 查看他的元表

    t = {}

    print(getmetatable(t))  -->nil

可以用setmetatable(t, t1)来设置或修改任何table的元表

在Lua代码中,只能设置table的元表。


算术类的元方法   

    Set = {}

function Set.new(l)

local set = {}

for _, v in inpairs(l) do set[v] = true end

return set

-- body

end

function Set.union( a, b )

local res = Set.new{}

for _ in pairs( a ) do res[_] = true end

for _ in pairs( b ) do res[_] = true end

return res

end

function Set.intersection( a, b )

local res = Set.new{}

for _ in pairs( a ) do

res[_] = b[_]

end

return res

-- body

end



关系类的元方法

指定table的关系操作符



table访问的元方法

__index元方法 

    用于查询,当访问一个table中一个不存在的字段时,得到的结果为nil。这是对的,但并不是完全正确。实际上,这些访问会促使解释器去查找一个叫__index的元方法。如果没有这个元方法,那么访问结果如前述的为nil,否则,就由这个元方法来提供最终结果。


__newindex元方法

    用于更新,当对一个table中不存在的索引进行复制时,解释器就会查找__newindex元方法。如果有这个元方法,解释器就会调用它,而不是执行赋值。如果这个元方法是一个table,解释器就在此table中进行赋值,而不是对原来的table。

rawset

    可以绕过元方法,调用rawset(t, k, v)就可以不涉及任何元方法而直接设置table t和与key k相关的value v



跟踪table的访问

    利用__index 和 __newindex 对table进行跟踪。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.1程序块:Lua执行的每段代码,例如一个源代码文件或者交互模式中输入的一行代码,都称为一个程序块 1.2注释:...
    c_xiaoqiang阅读 7,416评论 0 9
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,711评论 0 17
  • 【养生篇】一碗米糊下去了,早上还有一样东西也很重要——水煮蛋。水煮蛋虽然什么味道都没有,但是所有鸡蛋制作的方法里面...
    晨曦_邱月晖阅读 4,292评论 0 0
  • 来源:技术邻 作者:机械式呆滞 现代汽车制造业的核心是安全和环保,对车身要求“提高强度、减轻重量”。先进高强度钢在...
    技术汪阅读 2,944评论 0 0
  • 谨以此文怀念我那被美食与爱所填满的青春。 每逢假期回家,母亲总是每天变着法儿为我做各种家乡的特色小吃和她的拿手好菜...
    沈画檐阅读 8,162评论 16 22