Lua中强大的元方法__index详解

今天要来介绍比较好玩的内容:__index元方法

我是备胎,记得回头看看

咳咳,相信每一位女生都拥有或者不知不觉中拥有了一些备胎,啊!当然,又或许是成为过别人的备胎。

没有备胎的人,就不是完整的人生。(扯远了。。。)

我们来想象一下,如果对一个table进行取值操作,但是table根本就没有这个值呢?

比如:

    local t = {
        name = "hehe",
    }

    local mt = {
        __index = function(table, key)
            print("虽然你调用了我不存在的字段,不过没关系,我能探测出来:" .. key);
        end
    }

    setmetatable(t,mt);  --或者这样写t = setmetatable({name = "hehe"}, mt)

    print(t.money);

如果这里的t没有元表,那么这里打印的结果就是:nil,因为t里面确实没有“money”这个key,自然也就没有对应的值。

但是如果给t设置了元表,那么情况就变了。

Lua查找一个表的元素时的规则如下:

1、在表中查找,如果找到,返回该元素,找不到,转到步骤2

2、判断该表是否有元表,如果没有,返回nil,如果有,转到3

3、判断元表有没有__index元方法,如果__index元方法为nil,则返回nul;如果__index方法是一个表,则重复1,2,3;如果__index方法是一个函数,则调用之。

所以说,__index元方法是不是有点备胎的意思呢,只有表里找不到的时候,才会想到元表中的__index元方法。

原文地址:https://www.cnblogs.com/dongerlei/p/5606086.html