__index:是metatable的一个索引,它的值可以是表或者函数
local tA = {};
local tB = {a=2};
tB.__index = tB;
setmetatable(tA, tB);
print(tA.a);
--2
查找过程:
1. 在表中查找,如果找到,返回该元素,找不到则继续2。
2. 判断该表是否有元表,如果没有元表,返回nil,有元表则继续3 。
3. 判断元表有没有__index,如果__index方法为nil,则返回nil;如果__index的值是一个table,则重复1、2、3;如果__index的值是一个function,则返回该函数的返回值。
__newindex:是metatable的一个索引
给一个不存在的key赋值时,lua会在metatable里查找__newindex
local tA = {};
local tB = {a=2};
tB.__newindex = function(t, k, v)
rawset(t, k, v);
end
setmetatable(tA, tB);
print(tA.a);--nil
tA.a = 10;
print(tA.a);--10
__newindex的值在这里是一个函数,有三个参数分别表示:表,键和值
Lua模拟面向对象:
local Person={
name="person";
}
function Person:eat()
print("person eat");
end
--new函数负责创建Person对象
function Person:new(name)
local abj={};
--访问表中不存在的k时,会调用__index,此时self是Person
self.__index=self;
--对表中不存在的k进行赋值时,会调用__newindex
self.__newindex=function(t,k,v)
rawset(t,k,v);--在不触发任何元方法的情况下 将 table[index] 设为 value
end
setmetatable(obj, self);
obj.name=name;
return obj;
end
local Man={
age=3;
}
setmetatable(Man, Person);
function Man:new(name,age)
local obj=Person:new(name);
obj.__index=self;
setmetatable(obj, self);
return obj;
end
function Man:eat()
print("man eat");
end
function Man:run()
print("eat run");
end
local person=Person:new("Person");
person:eat();
local man=Man:new("boy",3);
man:eat();
man:run();