lua元方法__index,对table进行初始化,设置默认值

 当访问一个table不存在的索引时,lua解释器回去查找table中是否有__index 这个元方法,如果存在返回__index 最终的调用结果,如果不存在那么就返回一个空值nil。当创建一个新的table时,默认没有元表,对不存在的索引访问直接返回nil,可以通过设置元表,元方法使其调用__index

返回nil的情况:

local t = {}
print(t[2]) :--返回nil

设置元方法__index

local t = {}
local mt = {}
local prototype = {1,2,3}
setmetatable(t,mt)
mt.__index = function(t,k)
	return prototype[2]
end
print(t[2]) --> 输出2

通过这一属性,我们可以对一个table 设置默认值,也就是说,对于一个table,创建的时候,对没有赋值过的,或者不存在的索引,给一个默认值0,就像C中对新定义的数组初始化成0一样

function setDefault(t)
	local res = {__index = function(t,k)
		return 0
	end}
	setmetatable(t,res)

end

local t = {} ;
setDefault(t)

print(t[2]) ---〉输出0


### Lua 表使用教程 #### 定义表和设置方法 Lua 中的表(metatable)允许程序员定义特殊的行为来改变表格的操作方式。当对一个表执行某些操作时,这些操作会触发特定事件,而方法就是用来处理这些事件的方法。 创建并关联表到某个表的方式如下: ```lua local myTable = {} local metaTable = {} setmetatable(myTable, metaTable) ``` 上述代码片段展示了如何初始化一个新的空表 `myTable` 并为其分配了一个新的表 `metaTable`[^1]。 #### 常见方法介绍 ##### __index 方法 当尝试访问表中不存在的键时,将会调用此方法。这使得可以通过另一个表或者函数提供默认值或实现继承特性。 ```lua -- 当访问未定义字段时返回 nil 或其他指定值 function metaTable.__index(table, key) print("Accessing non-existent field:", key) return nil -- 可替换为任何想要作为缺省值得东西 end ``` ##### __newindex 方法 每当向表插入新素或更新已有素的时候都会触发该方法。利用它可以拦截写入动作并对数据进行验证或其他预处理工作。 ```lua function metaTable.__newindex(tbl, key, value) print(string.format("Setting %s to %d", tostring(key), tonumber(value))) rawset(tbl, key, value * 2) -- 将实际存储的数据翻倍 end ``` ##### __call 方法 使表能够像函数一样被调用。这对于创建类实例化模式非常有用,在面向对象编程中有广泛应用场景。 ```lua function metaTable.__call(self, ...) local instance = setmetatable({}, self) if self.init then self.init(instance, ...) -- 如果存在 init 函数,则调用它来进行初始化 end return instance end ``` 以上介绍了几种常用的方法以及它们的应用案例。通过合理运用这些功能,可以在不修改原始逻辑的基础上极大地扩展程序的功能性和灵活性。 #### 实际应用场景举例 假设有一个需求是要记录每次访问某张表里特定项的时间戳。那么就可以借助于 `__index` 来完成这项任务: ```lua local logTable = setmetatable({timeStamps={}}, { __index=function(t,k) t.timeStamps[k]=os.date("%Y-%m-%d %H:%M:%S") return rawget(t, k)-- 返回原表对应位置上的真实值 end, }) logTable["example"]="test" print(logTable.timeStamps.example) --> 输出时间戳字符串表示形式 ``` 这段脚本演示了怎样利用表追踪对给定表内条目的读取情况,并自动维护一份日志记录下来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值