Lua之面向对象

__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();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值