在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"],"and",t.foo,"is same")
print(t["fuck2"],"and",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()
函数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"],"and",t.foo,"is same")
print(t["fuck2"],"and",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()