Lua语言面向对象学习记录一

一、基础:Lua元表

1、元表目的:
对两个Table进行操作,从而改变Table的行为
栗子: 为了实现 使 表A和表B中元素互相加起来
Lua先检查任一表 是否有 元表;
接着检查是否有“_add”字段;
_add为 即时字段 对应着一个函数或者表, 我们称其对应的字段为元方法 键

处理 元表 的函数
1、setmetatable(table,metatable) // 对指定table设置元表,如果元表中_metatable即时字段的值,则函数会设置失败
2、getmetatable(table) //返回对象的元表

栗子:

test_table={}  //普通的表
test_metatable={}  //元表(空键值)
setmetatable(test_table,test_metatable) //把test_metatable设置成test_table的元素

或者直接写成

test_table=setmetatable({}{})
getmetatable(test_table)    //返回值为test_metatable

3、常用的元方法

_index方法

当_index元方法是函数的时候:
当碰上以下的情况

local t={name = "zlk"}
print(t{money]); //返回了nil
local t={name="zlk"}
local mt={
      _index=function(table,key)
         print("未检测到您要搜索的字段:",key);
      end
}
setmetatable(t,mt);
print(t[money]); //当调用了不存在的money字段时,就会调用table元表里的__index元方法,并且会传递table和字段名两个参数。

输出:

未检测到您要搜索的字段:money
nil

元方法是table的时候

local t={name="zlk"}
local mt={
      _index={money="900,000"}
}
setmetatable(t,mt);
print(t[money]);

输出:

 900,000

我们给_index赋值了一个table,其中table有 下标为money的元素900000;
那么,当调用t的某个不存在的字段时,就会去查找__index里的table,如果找到这个字段,就调用它。即以下步骤

1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。

由_index元方法到继承

 local person={
     name="zlk",age=22,money=9990000,
     speak=function(param)
          print("hello");
     end
}
local t1={};
local t2={};

local mt={_index=person}
setmetatable(t1, mt);
setmetatable(t2, mt);
print(t1[money]);
t2.speak();  //不知道可不可以写成t2[speak()]

这里很容易理解 上述的继承关系了: t1和t2继承了mt的属性!!!

_newindex 元方法

_newindex方法用于对表的更新操作(_index用于对表的访问);
当要给表中缺少的索引赋值时,解释器首先就会查找_newindex方法;
栗子:

mt={};
t=setmetatable({key1="value1"},{_newindex=mt});
print(t[key1]);        //value1

t[key2]="value2"
print(t[key2],mt[key2]);  //nil , value2

t[key1]="v";
print(t[key1],mt[key1]);  // v,nil

以上实例中表设置了元方法 __newindex,在对新索引键(key2)赋值时(t.key2 = “value2”),会调用元方法,而不进行赋值。而如果对已存在的索引键(key1),则会进行赋值,而不调用元方法 __newindex

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值