31. Lua table 访问的元方法

本文详细介绍了Lua中元方法(__index和__newindex)的概念,以及如何创建构造函数、原型、元表来实现对象的属性查找和更新。此外,还展示了如何追踪table的访问和定义只读table的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. __index元方法 (用于检索)
window = {}  -- 创建一个名称空间

-- 使用默认值来创建一个原型
window.prototype = { x = 0 , y = 0 , width = 100 , height = 100 }
window.mt = {}  -- 创建元表
-- 声明构造函数
function window.new(o)
  setmetatable( o , window.mt )
  return o
end

-- window.mt.__index = function( table , key )
-- 	return window.prototype[key]
-- end

window.mt.__index = window.prototype

w = window.new{ x = 10 , y = 20 }
print(w.width)
print(w.x)
print(w.xxxx)
  1. __newindex 元方法 (用于更新)
local key = {}
local mt = { __index = function(t)  return t[key] end }
function setDefault( t , d )
  t[key] = d
  setmetatable( t , mt )
end
tab = { x = 10 , y = 20 }
print( tab.x , tab.z )
setDefault( tab , 100 )
print( tab.x , tab.z )
--]]

--[[
-- 跟踪 table 的访问
t = {}  -- 原来的table(在其他地方创建的)
-- 保持对原table的私有的访问
local _t = t

-- 创建一个代理
t = {}

-- 创建一个元表
local mt = {
  __index = function( t , k )
  	print("*access to element " .. tostring(k) )
  	return _t[k]  -- 访问原来的table
  end ,
  __newindex = function(t,k,v)
  	print("*udate of element " .. tostring(k) .. " to " .. tostring(v) )
  	_t[k] = v
  end
}

setmetatable( t , mt )

t[2] = "Hello"
print(t[2])
  1. 定义一个只读的 table
function readonly(t)
  local proxy = {}
  local mt = {
  	__index = t ,
  	__newindex = function( t , k , v)
  		error("attempt to update a read-only table" , 2 )
  	end
  }
  setmetatable(proxy , mt)
  return proxy
end

days = readonly{"Sunday" , "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Sataurday" }

print(days[1])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值