lua:有关表访问的metamethod

这篇具有很好参考价值的文章主要介绍了lua:有关表访问的metamethod。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

针对在两种正常状态:表的不存在的域的查询和修改,Lua也提供了改变 tables的行为的方法。

index metamethod

我们可以通过index元方法来实现访问table内部不存在的域时人为操控返回数据。

比如以下测试代码:

local set = {1,2,3}
setmetatable(set,{
    __index = function (t, k)
        print("index func "..k)
    end
})
print(set[4]) --index func 4     nil

set = {}
print(set[4]) --nil

由上可以看出当我们去访问表内不存在的域时会走一遍__index函数并取得相应返回值。同时我们需要注意的是在后期重新赋值整表的时候其metatable已经刷新,所以再次访问不存在的域时已不存在之前的效果。

__index同样可以是一个table类型而非函数类型,这样的意义即如若访问不存在的域则寻找这个table B,否则则查找这个table B的__index metamethod。

local A = {1,2,3}
local B = {["a"] = 4,["b"] = 5}
setmetatable(B,{
    __index = function (t,k)
        print("test B index func")
    end
})
setmetatable(A,{
    __index = B
})
print(A["a"]) --4
print(A["b"]) --5
print(A["c"]) --test B index func

因此则可以引出lua的重要概念:继承,通过index函数可以实现没找到原table的域时可以从父类寻找。

如若不想经过index操作则直接调用rawget(t,i)来寻找相应值。

newindex metamethod

__newindex metamethod在对表缺少的域赋值的时候会被调用,注意,调用了__newindex之后并不会自动进行赋值操作,意味着在newindex函数里需要手动赋值才行。参考如下代码:

local A = {1,2,3}
setmetatable(A,{
    __newindex =function (t, k, v)
        print("test A newindex func")
    end
})
A[4] = 4 --test A newindex func
for i = 1,4 do
    print(A[i]) -- 1 2 3 nil
end

可以发现赋值了key=4之后的A[4]访问值依然为nil,说明newindex内部仍然需要显式加上t[k] = v才可。

如若不想经过newindex操作则直接调用rawset(t,k,v)来进行表的赋值。

默认值的表

直接重写index函数,如若访问到了不存在的域,则默认返回某值即可,参考如下代码:

local A = {1,2,3}
setmetatable(A,{
    __index = function (t, k)
        return 1
    end
})
for i = 1,4 do
    print(A[i]) -- 1 2 3 1
end

当然如果担心每个对象都需要默认值访问逻辑,但是默认值都不同,也可以表内部维护一个local table变量,__index实际上就是调用这个local变量里的某个键值对即可,如下所示:

local A = {1,2,3}
local key = {}
setmetatable(A,{
    __index = function (t, k)
        return A[key]
    end
})

A[key] = 1 --如果后续每个对象都需要不同的默认值,则直接修改即可,不用担心冲突
for i = 1,4 do
    print(A[i]) -- 1 2 3 1
end

监控表

顾名思义,当我们对某个表进行赋值或者访问操作时,需要进行记录。我们可以创建一个代理表,这个代理表不存储任何数据,修改__index和__newindex函数来输出记录并定位至原表,如下所示:

local A = {1,2,3}
function Record(tb)
    local proxy = {}
    setmetatable(proxy,{
        __index = function (t, k)
            print("index")
            return tb[k]
        end,
        __newindex = function (t, k, v)
            print("newindex")
            tb[k] = v
        end
    })
    return proxy
end

local proxy = Record(A)
for i = 1,3 do
    print(proxy[i])
--[[
    index
    1
    index
    2
    index
    3
    ]]--
end
proxy[4] = 4 --newindex

只不过类似pairs的操作是无效的,因为proxy本身就是空表。

只读表

参考之前的博客:lua只读表-CSDN博客文章来源地址https://www.toymoban.com/news/detail-830258.html

到了这里,关于lua:有关表访问的metamethod的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言【编译器、变量、输入输出有关的】

    一些想到的【从编译器到变量到输入输出有关的】的问题,有些是按自己理解写的答,有些待解决。 C语言可以跨平台,汇编不可以,编译时C语言会根据不同系统翻译成不同形式的汇编语言。 C语言中算数运算会在寄存器中运行,变量保存在堆或栈中。 遗留问题 : C语言 变量

    2024年02月05日
    浏览(41)
  • Lua 通过元方法简单实现属性Get/Set访问

    通过元方法__index、__newindex、rawset,我们可以实现属性的Get/Set访问,类似于C#: __index 可视为该table中所有属性的Get方法,通过参数Key区分不同的属性; __newindex 可视为该table中所有属性的Set方法,通过参数Key区分不同的属性; 该方法的局限性在于,子表不得绕过元方法对属性

    2024年04月10日
    浏览(39)
  • C语言有关“函数用于调用的参数太少”问题解决办法

    🦄 个人主页 :修修修也 🎏 所属专栏 :程序调试及报错解决 ⚙️ 操作环境 : Visual Studio 2022 我们在使用C语言编写程序,特别是使用 函数递归 时经常会遇到编译器报错“ 用于调用的参数太少/太多 ”,如图: 那么遇到这种情况我们该如何解决呢? 首先以下面一段代码为例向

    2023年04月08日
    浏览(35)
  • 初始C语言(7)——详细讲解有关初阶指针的内容

     第一章 “C“浒传——初识C语言(1)(更适合初学者体质哦!)  第二章 初始C语言(2)——详细认识分支语句和循环语句以及他们的易错点   第三章 初阶C语言(3)——特别详细地介绍函数   第四章 初始C语言(4)——详细地讲解数组的内容以及易错点   第五章

    2024年02月11日
    浏览(36)
  • 有关钱包相关开发的库和依赖

    Trezor 钱包 GitHub 组织:https://github.com/trezor 说明:Trezor 是一款硬件加密货币钱包,它的团队开发了与助记词相关的许多工具和库。 Electrum 钱包 GitHub 仓库:https://github.com/spesmilo/electrum 说明:Electrum 是一款比特币轻量级钱包,它的团队也开发了与助记词相关的工具和库。 BIP4

    2024年04月29日
    浏览(31)
  • R语言有关模型方面的函数(model.)介绍-model.matrix

    最近闲暇时间大量阅读了一些机器学习方面的 R 包源码,在此对阅读过程中的一些实用但是不常见的函数进行了整理,不论以后大家是使用R建模,还是使用R或者Rcpp开发程序包,都希望对大家有所帮助! model.matrix :可以根据公式提取模型中的设计矩阵(添加了截距项),请

    2024年02月07日
    浏览(38)
  • C语言简单的数据结构:单链表的有关算法题(2)

    接着我们介绍后面的三道题,虽然代码变多了但我们的思路更加通顺了 题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/ 创建新链表,遍历原链表,将节点值小的进行尾插到新链表中 这里要多次进行对NULL的判断,开始传入列表,中间newHead的判断,循环出来一个为NULL的判断

    2024年04月15日
    浏览(62)
  • Lua语言实现游戏动作

    Lua是一种轻量级的脚本语言,它具有高效性、可扩展性和易学性等优点。在游戏开发领域,Lua语言得到了广泛应用。Lua语言可以用来实现游戏动作,包括角色行走、攻击、技能释放等。本文将详细介绍如何使用Lua语言实现游戏动作。 一、Lua语言介绍 Lua语言是一种轻量级的脚

    2023年04月14日
    浏览(37)
  • C语言调用lua

    欢迎关注公众号:fensnote C语言是一种非常流行的编程语言,而Lua是一种基于C语言开发的脚本语言。相信大家都知道,Lua可以使用C语言来扩展其功能,进而实现更复杂的功能。而在Lua的各种实现中,luajit也是其中一种非常流行的实现。在本篇博客中,我将为大家介绍如何使用

    2024年02月07日
    浏览(35)
  • Lua脚本语言

    Lua(发音为\\\"loo-ah\\\",葡萄牙语中的\\\"lua\\\"意为月亮)是一种轻量级的、高效的、可嵌入的脚本编程语言。官网Lua最初由巴西计算机科学家Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo于1993年开发,它的设计目标是提供一种简单的、易扩展的脚本语言,特别适用于嵌入到其他

    2024年02月07日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包