【Lua】元表使用示例

  • 在Lua中,元表(metatable)是一种强大的机制,允许你改变表的行为。
  • 通过元表,你可以控制表的操作,比如访问、赋值、运算等。
  • 元表提供了一个灵活的方法来重载或扩展Lua的内建行为。

1. 元表的基本概念

元表本质上是一个表,可以包含特殊的字段(元方法),这些字段决定了其关联表在特定操作下的行为。比如,当对表进行加法运算时,如果该表有一个元表且元表中定义了__add元方法,那么就会调用这个__add元方法

2. 常用元方法

  • __index:用于在表中查找不存在的键
  • __newindex:用于在表中设置不存在的键
  • __add:用于表的加法运算
  • __sub:用于表的减法运算
  • __mul:用于表的乘法运算
  • __div:用于表的除法运算
  • __tostring:用于将表转换为字符串
  • __call:用于将表作为函数调用

3. 设置和使用元表

可以使用setmetatable函数来设置一个表的元表,并使用getmetatable函数来获取一个表的元表

4. 示例代码

1. __index

local t = {}

local mt = {
    __index = function(table, v)
        if v == "Value" then
            return "Value"
        else
            return "not Value"
        end
    end
}

setmetatable(t, mt)

print(t.Value) -- Value
print(t.num) -- not Value

2. __newindex

local t = {}

local mt = {
     __newindex = function(table, key, value)
        rawset(table, key, "modified_" .. value)
    end
}

setmetatable(t, mt)

t.Value = "Value"
print(t.Value) -- modified_Value

3. __add

local t1 = {}
local t2 = {}

local mt = {
    __add = function(t1, t2)
        return t1.num + t2.num
    end
}

setmetatable(t1, mt)
setmetatable(t2, mt)

t1.num = 26
t2.num = 54

print(t1 + t2) -- 80

4. __tostring

local myTable = { name = "胡图图", address = "翻斗花园"}

local mt = {
    __tostring = function(table)
        return "我叫" .. table.name .. ", 我住在" .. table.address
    end
}

setmetatable(myTable, mt)

print(myTable) -- 我叫胡图图, 我住在翻斗花园

5. __call

local myTable = {}

local mt = {
    __call = function(table, arg1, arg2)
        return arg1 + arg2
    end
}

setmetatable(myTable, mt)

print(myTable(1,2)) -- 3

在Lua中,定义元表(metatable)中的元方法时,通常第一个参数是table,这是因为元方法是与特定的表关联的。
这些元方法实际是在操作表时自动调用的函数,Lua会将与之相关的表作为第一个参数传递给这些函数。
这样,可以在元方法中操作和访问这个表

相关推荐

  1. Lua使用示例

    2024-07-10 02:54:02       26 阅读
  2. Lua 方法

    2024-07-10 02:54:02       45 阅读
  3. lua 中的

    2024-07-10 02:54:02       42 阅读
  4. 15、Lua (Metatable)

    2024-07-10 02:54:02       33 阅读
  5. Lua (Metatable)深入解析

    2024-07-10 02:54:02       29 阅读
  6. Lua语法(三)——方法

    2024-07-10 02:54:02       36 阅读
  7. 29、Lua中的方法

    2024-07-10 02:54:02       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 02:54:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 02:54:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 02:54:02       57 阅读
  4. Python语言-面向对象

    2024-07-10 02:54:02       68 阅读

热门阅读

  1. 使用 apktool 解包 apk 并重新打包签名

    2024-07-10 02:54:02       21 阅读
  2. Mobile ALOHA前传之VINN, Diffusion Policy和ACT对比

    2024-07-10 02:54:02       24 阅读
  3. React面试题之setState的执行机制

    2024-07-10 02:54:02       23 阅读
  4. 如何控制代码质量

    2024-07-10 02:54:02       22 阅读
  5. C++常用类

    2024-07-10 02:54:02       26 阅读
  6. springboot 与 ipv6

    2024-07-10 02:54:02       21 阅读
  7. UI还原度小技巧之缩放

    2024-07-10 02:54:02       27 阅读
  8. 腾讯centos mysql安装

    2024-07-10 02:54:02       21 阅读