在 Lua 中,元表(metatable)是一种强大的机制,用于改变表的行为。元表允许你定义表的一些特殊操作,例如表的相加、相减、索引等。以下是有关 Lua 元表的基本概念和使用方法:

基本概念:

1. 每个表都可以关联一个元表:
   每个 Lua 表都可以关联一个元表,通过设置 setmetatable 函数。
   local myTable = {}
   local myMetatable = {}
   setmetatable(myTable, myMetatable)

2. 元表的特殊方法:
   元表中可以定义一些特殊方法,例如 __index、__newindex、__add、__sub 等,以改变表的默认行为。

示例:

1. 使用 __index 实现默认值:
   local myTable = {}
   local myMetatable = {__index = {default = 42}}
   setmetatable(myTable, myMetatable)

   print(myTable.default)  -- 输出: 42,当访问不存在的键时,会使用默认值

2. 使用 __add 实现表的相加:
   local table1 = {10, 20, 30}
   local table2 = {40, 50, 60}

   local metatable = {
       __add = function(t1, t2)
           local result = {}
           for i = 1, #t1 do
               result[i] = t1[i] + t2[i]
           end
           return result
       end
   }

   setmetatable(table1, metatable)
   setmetatable(table2, metatable)

   local resultTable = table1 + table2

   现在,resultTable 中的元素为 {50, 70, 90}。

3. 使用 __newindex 实现对表的写保护:
   local myTable = {}
   local myMetatable = {
       __newindex = function(table, key, value)
           error("Attempt to modify read-only table")
       end
   }
   setmetatable(myTable, myMetatable)

   myTable.name = "John"  -- 尝试写入会触发错误

这些是关于 Lua 元表的基本概念和一些示例。元表为 Lua 提供了一种灵活的方式来定制表的行为,使得编程更加强大和可扩展。


转载请注明出处:http://www.zyzy.cn/article/detail/6498/Lua