lua __index和__newindexde 区别

lua为了实现类似于c#继承的功能,有setmetatable函数,为一个子脚本设置一个父脚本,这时候就会用到__index和__newindex属性。

 

__index:当子脚本不存在被访问的元素的时候,lua就会调用__index,去父脚本里面查找该元素。

__newindex:当子脚本不存在被访问的元素,我们却给该元素赋值的时候,默认我们没有给__newindex赋值,lua会直接修改父脚本里面同名元素的值;如果我们给__newindex赋值了,即指定了一个函数,定制了一个我们希望进行的操作,lua就会调用该函数,而不会直接去修改父脚本里面的同名元素的值。

 

举个例子:

(1)未对__newindex赋值的情况:

  local smartMan = {
        name = "none",
        money = 9000000,
       
        sayHello = function()
            print("大家好,我是聪明的豪。");
        end
    }
   
    local t1 = {};
   
    local mt = {
        __index = smartMan,
    }
   
    setmetatable(t1, mt);
   
    t1.sayHello = function()
        print("en");
    end;
   
    t1.sayHello();

 

[LUA-print] en

 

 

(2)对__newindex赋值的情况:

 local smartMan = {
        name = "none",
        money = 9000000,
       
        sayHello = function()
            print("大家好,我是聪明的豪。");
        end
    }
   
    local t1 = {};
   
    local mt = {
        __index = smartMan,
        __newindex = function(table, key, value)
            print(key .. "字段是不存在的,不要试图给它赋值!");
        end
    }
   
    setmetatable(t1, mt);
   
    t1.sayHello = function()
        print("en");
    end;
    t1.sayHello();

 

[LUA-print] sayHello字段是不存在的,不要试图给它赋值!
[LUA-print] 大家好,我是聪明的豪。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值