Lua __index

作者: AlbertS | 来源:发表于2016-06-28 14:48 被阅读1035次

前言#

上一篇文章中大概讲了API函数lua_getfield的用法,其中讲到调用lua_getfield方法时可能触发对应 "index" 事件的元方法,下面我们来看一下这个神奇的元方法。

内容#

元方法在lua中堪称强大,我们来试想一下,如果对一个table进行取值操作,但是table根本就没有这个值呢?一般情况下,lua会返回一个lua独有的值nil来表示访问的值不存在。那么如果我们不希望这样,而是想在访问无效时调用一个默认的操作应该怎么办呢?这就需要我们实现这个表的元表,以及元表的__index方法,实现的过程如下:

  • 首先我们新建一个文件,文件命名为__index.lua,然后在文件中编写如下代码:
-- 定义一个table
local information = 
{
    name = "tom",
    age = 18,
    sex = "man",
}

-- 打印一下信息
print("the information is :")
print(information.name)
print(information.age)
print(information.sex)
print(information.address)

local mt = {
    __index = function(table, key)
    print("I haven't this field : " .. key);
end
}

-- 设置原表
setmetatable(information, mt);

-- 再次打印信息
print("\nafter set __index, the information is :")
print(information.name)
print(information.age)
print(information.sex)
print(information.address)

  • 结果


    __index.png

总结#

  • 在实现__index方法之前,打印address的值显示是nil
  • 元表中我们定义了__index方法,给出了自己的提示信息,那么当调用information表中的值再次为nil时就会调用我们写的默认方法给出提示。
  • 学会用元方法来解决table字段的默认值问题。

相关文章

  • Lua __index

    前言# 上一篇文章中大概讲了API函数lua_getfield的用法,其中讲到调用lua_getfield方法时可...

  • lua部分使用问题及格式化

    1,table index is nil lua 表明table的下标是nil,有问题,需更改下标 2,lua格式...

  • 对lua中类、实例、继承的理解

    lua底层有__index等表,去实现类,实例、继承。但是比较绕。 参考1.1.5.Lua语言面向对象之复制表的方...

  • Lua实现继承

    Lua元表使用 中的__index元方法可以实现面向对象和继承关系: lua中没有类的概念,只有table,但可以...

  • Lua __index、__newindex、rawset、ra

    Aitin原创稿件,转载请注明出处!使用Lua 也很久了,这里写一点使用心得 __index元方法 这是 meta...

  • lua “attempt to index a nil valu

    有一种可能是: array[index] 中的index 太大

  • Lua index 和 newindex 元方法

    上一篇文章简单介绍了 Lua 中的元表和元方法,那么在这里就接着重点讲解一下 Lua 中的 index 和 new...

  • Lua中__index和__newindex实践

    具有默认值的table 我们都知道,table中的任何字段的默认值都是nil,但是通过元表,我们可以很容易的修改这...

  • Lua实现KVO

    Lua元表使用 __index和__newindex方法有点类似get和set方法,可以利用这个特性实现监听tab...

  • Lua实现继承

    Lua元表使用[https://www.jianshu.com/p/ef03c9d33c67] 中的__index...

网友评论

    本文标题:Lua __index

    本文链接:https://www.haomeiwen.com/subject/mlstjttx.html