玖叶教程网

前端编程开发入门

lua 中元表的使用

在 lua table 中可以访问对应的key 得到 value 但无法对两个 table 进行操作lua 提供了 元表(Metatable),允许改变table 的行为 每个行为关联了对应的元方法

setmetatable(table,metatable):对指定 table 设置元表 如果元表中存在_metatable 键值setmetatable会失败

getmetatable(table):返回对象的元表(metatable)

mytable = {}

myMetatable = {}

setmetatable(mytable,myMetatable)

‐‐‐‐‐‐‐‐‐‐‐or‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐

mytable = setmetatable({},{})

getmetatable(mytable) ‐‐ 返回 mymetable

_index 元方法

这是 metatable 中 最常用的键

当你通过键 来访问 table 的时候 如果这个键没有值 那么 lua 会寻找该 table 的

metatable 中的_index键 . 如果_index包含一个 table , lua 会在表格中查找相

应的键

other = {foo = 3}

t = setmetatable({},{_index = othre})

t.foo

如果 _index 包含一个个函数,lua 就会调用该函数,table和键 作为参数传递给函

_index 元方法查看元素是否存在 不存在则返回 nil 存在则由 _index返回结果1 mytable = setmetatable({key1 = "value"},{

_index = function(mytable,key)

if key == "key2" then

return "metatablevalue"

else

return nil

end

end

})

print(mytable.key1,mytable.key2)

‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐or‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐

mytable = setmetatable({key1 = "value1"},{_index = {key2 = "metatablevalue"}})

lua 查找一个表元素的规则

  • 在表中查找,如果找到 返回该元素 找不到则继续
  • 判断该表是否有元表,如果没有元表,返回nil ,有元表 则继续
  • 判断元表是否有_index 方法 如果_index 为nil return nil 如果 _index 是 table ,重复以上,如果是一个函数 则返回函数的返回值

__newindex 元方法

__newindex 用来对表更新 ,__index 用来对表访问

当 给 table 的一个缺少的索引赋值 解释器就会查找 __newindex 元方法 如果

存在则调用函数而不进行赋值操作

mytable = {}

mytable = setmetatable({key1 = "val1"},{__newindex = mymetatable })

print(mytable.key1)

mytable.newkey = "新值2"

print(mytable.newkey,mymetatable.newkey)

mytable.key1 = "新值1"

print(mytable.key1,mymetatable.key1)

在 table 中设置 元方法 __newindex 在对新索引键 赋值时 会调用 元方法 而不

进行赋值

对 table 中已经存在的索引键 则进行赋值 而不调用 元方法

myTable = setmetatable({key1 = "value1"},{

__newindex = function(myTable,key,val)

rawset(myTable,key,'"\"'..val..'"\"')

end})

myTable.key1 = "new value"

myTable.key2 = 4

print(myTable.key1,myTable.key2)

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言