美文网首页Lua语言
Lua __index、__newindex、rawset、ra

Lua __index、__newindex、rawset、ra

作者: xzhuan | 来源:发表于2018-11-01 12:47 被阅读26次

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

__index元方法

这是 metatable 最常用的key。
当你通过key来访问 table 的时候,如果这个key没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index key。如果__index包含一个table,Lua会在该table中查找相应的key。

local class_a =  { a = 1 }
local class_b = setmetatable({}, { __index = class_a }) 
print(class_b.a)

如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。
__index 元方法查看表中元素是否存在,如果不存在,返回结果为 nil;如果存在则由 __index 返回结果。

local class_a =  function (table,key)
   if key=="a" then
       return 1
   end
end
local class_b = { b = 2 }
class_b = setmetatable( class_b, { __index = class_a }) 
print(class_b.a)
print(class_b.b)

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

__newindex 元方法

__newindex 元方法用来对表更新,__index则用来对表访问 。
当你给表的一个缺少的key赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。

local class_a =  {}
local class_b = { b = 2 }
class_b = setmetatable( class_b, { __newindex  = class_a }) 
print(class_b.b)
class_b.a = "a"
print(class_b.a)
print(class_a.a)
class_b.b = "b"
print(class_b.b)
print(class_a.b)

rawset(table,key,value) 函数

local class_a =  function (table,key,value)
   rawset(table, key, "\""..value.."\"")
end
local class_b = { b = 2 }
class_b = setmetatable( class_b, { __newindex  = class_a }) 
print(class_b.b)
class_b.a = "a"
print(class_b.a)

rawget(table, index)函数

解释:根据参数table和index获得真正的值table[index],也就是说根本不会调用到元表,其中参数table必须是一个表,而参数index可以使是任何值。

--  定义一个table
local class_b = { b=2 }
--  定义元表
local class_a = { a=1 }

-- 先打印没有元表的情况
print("class_b.b =",class_b.b)
print("class_b.a =",class_b.a)

-- 设置元表
setmetatable(class_b, {__index = class_a})

-- 打印有元表的情况
print("class_b.b =",class_b.b)
print("class_b.a =",class_b.a)

-- 打印不使用元表的情况
print("class_b.b =",rawget(class_b,"b"))
print("class_b.a =",rawget(class_b,"a"))

哇咔咔~~~

相关文章

  • Lua __index、__newindex、rawset、ra

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

  • Lua实现KVO

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

  • Lua index 和 newindex 元方法

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

  • Lua中__index和__newindex实践

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

  • lua中__index和__newindex的使用

    很多人都知道lua中_index用于查询,_newindex用于更新,但是应用起来还是很模糊,我在这针对这做了个详...

  • Lua __newindex

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

  • Lua base rawset()

    前言 咱们今天还是接着两个月前的思路往下写,既然上一篇文章讲到了rawget函数,那么想必你也猜到了。这一篇函数必...

  • Lua __index

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

  • IndexError: list index out of ra

    在今晚练习Matplotlib读取CSV文件并绘图的过程中,出现错误: IndexError: list inde...

  • IndexError: list index out of ra

    如题,对index这种的异常处理的解决方法有以下两种: 1、 用 try捕获处理 2、用len()做个判断

网友评论

    本文标题:Lua __index、__newindex、rawset、ra

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