概述在lua中任何变量都有一个元表(我相信每个字符串元表都是string相关,所以可以使用string:length()),元表中特殊的值有特殊的含义,比如__index,__call,__add等等。 函数setmetatable(a,meta) 就是将meta设置为这个名字叫做a的table的元表。所以设置元表语法上有多种花样。 如: function class(base) return set @H_301_2@ 在lua中任何变量都有一个元表(我相信每个字符串元表都是string相关,所以可以使用string:length()),元表中特殊的值有特殊的含义,比如__index,__call,__add等等。 函数setMetatable(a,Meta) 就是将Meta设置为这个名字叫做a的table的元表。所以设置元表语法上有多种花样。 如: function class(base) return setMetatable({},{ __call = _instantiate,__index = base }) end 以上就是新建一个空表,但是他的元表的__index的值是base,由于setMetatable函数会返回第一个参数,所以该函数会返回 {} 这个空表。 另外元表中的__index可以是函数(或者是表),以下: fuck_table = {fuck1 = "oh yeah hardly"} t = setMetatable({},{ __index = function(t,key) if key == "foo" then return 99 else return fuck_table[key] end end }) print(t["fuck1"],"and",t.fuck1,"is same") print(t["foo"],t.foo,"is same") print(t["fuck2"],t.fuck2,"is same") 当然如果你高兴,你也可以事先创建一张表,而这个表里面刚好有__index,如下: teacher = {} teacher.mt = {} teacher.mt.__index = {yes = 1,no = 2,ok = 3,truth = 4} function teacher.new (ttt) return setMetatable(ttt,teacher.mt) end student = {no = 0,ok = 99} teacher.new(student) print(student.yes) print(student.ok) 那么利用这个特性就可以完成继承了,如下: a = {} a.asd = "ddd" function a:new(b) b = b or {} return setMetatable(b,{ __index = self }) end function a.fuck() print("hehe,just a joke") end c = a:new() c.fuck() c.fuck = "jjjj" print(c.fuck) a.fuck() @H_301_2@ 总结
以上是内存溢出为你收集整理的lua元表理解全部内容,希望文章能够帮你解决lua元表理解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
评论列表(0条)