lua基础之元表
admin
2024-02-06 00:20:30
0

简介

Lua 提供了元表(Metatable),允许我们改变 table 的行为,每个行为关联了对应的元方法。

  • setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。
  • getmetatable(table): 返回对象的元表(metatable)。

__index

步骤

  1. 在表中查找,如果找到,返回该元素,找不到则继续
  2. 判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
  3. 判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复 1、2、3;如果 __index 方法是一个函数,则返回该函数的返回值。

实例

mytable = setmetatable({key1 = "value1"}, {__index = function(mytable, key)if key == "key2" thenreturn "metatablevalue"elsereturn nilendend
})print(mytable.key1,mytable.key2)

Output

value1 metatablevalue

实例解析

  • mytable 表赋值为 {key1 = “value1”}。
  • mytable 设置了元表,元方法为 __index。
  • 在mytable表中查找 key1,如果找到,返回该元素,找不到则继续。
  • 在mytable表中查找 key2,如果找到,返回 metatablevalue,找不到则继续。
  • 判断元表有没有__index方法,如果__index方法是一个函数,则调用该函数。
  • 元方法中查看是否传入 “key2” 键的参数(mytable.key2已设置),如果传入 “key2” 参数返回 “metatablevalue”,否则返回 mytable 对应的键值。

__newindex

步骤

在对新索引键赋值时,会调用元方法,而不进行赋值。而如果对已存在的索引键,则会进行赋值,而不调用元方法 __newindex。

实例

mytable = setmetatable({key1 = "value1"}, {__newindex = function(mytable, key, value)rawset(mytable, key, "\""..value.."\"")end
})mytable.key1 = "new value"
mytable.key2 = 4print(mytable.key1,mytable.key2)

output

new value “4”


__call

function table_maxn(t)local mn = 0for k, v in pairs(t) doif mn < k thenmn = kendendreturn mn
endmytable = setmetatable({10}, {__call = function(mytable, newtable)sum = 0for i = 1, table_maxn(mytable) dosum = sum + mytable[i]endfor i = 1, table_maxn(newtable) dosum = sum + newtable[i]endreturn sumend
})
newtable = {10,20,30}
print(mytable(newtable))

output

70


__tostring

实例

mytable = setmetatable({ 10, 20, 30 }, {__tostring = function(mytable)sum = 0for k, v in pairs(mytable) dosum = sum + vendreturn "表所有元素的和为 " .. sumend
})
print(mytable)

output

表所有元素的和为 60


操作符

__add -> ‘+’

__sub -> ‘-’

__mul -> ‘*’

__div -> ‘/’

__mod -> ‘%’

__unm -> ‘-’

__concat -> ‘…’

__eq -> ‘==’

__lt -> ‘<’

__le -> ‘<=’

相关内容

热门资讯

原创 3... 32岁程序员高先生在周六处理工作时突发不适,经抢救无效离世,这起事件引发了关于周末居家加班猝死能否认...
原创 别... 小毋今天想给大家好好聊一聊,1月21日,国际金价突破4850美元/盎司的消息刷了屏,可评论区里全是犹...
百度文心Moment大会开幕 ... 1月22日,百度发布并上线原生全模态大模型文心5.0正式版。该模型参数达2.4万亿,采用原生全模态统...
科技型中小企业融资记:从“不敢... 在中国创新驱动发展战略的背景下,科技型中小企业如雨后春笋般涌现。他们拥有前沿的技术、优秀的团队、广阔...
美元走软提振铜价上涨 美元走软和投资者普遍抛售货币和主权债券的影响,铜价攀升至每吨13,000美元以上。 1月23日,LM...
中稀有色大宗交易折价成交5.0... 中稀有色01月23日大宗交易平台共发生1笔成交,合计成交量5.00万股,成交金额359.50万元。成...
黄河财险2025年揽收保费16... (图片来源:视觉中国) 蓝鲸新闻1月23日讯(记者 陈晓娟)今日,黄河财产保险股份有限公司(下称“黄...
深圳调整商业用房购房贷款最低首... 观点网讯:1月23日,中国人民银行深圳市分行、深圳市住房和建设局消息,对深圳商业用房购房贷款政策作以...
洋河股份去年净利预降超六成,董... 中端和次高端价位段产品承压较大,苏酒龙头洋河股份去年净利润同比预降62%至68%。 1月23日晚间,...
金银价格在1月23日同时创下历... 金银价格在1月23日同时创下历史新高,市场情绪一下子被点燃,很多人都在感叹:这行情太猛了。黄金冲上4...
创金合信何媛:大类资产定价逻辑... 来源:滚动播报 (来源:财闻) 大部分基金经理将选择贴近基准进行类指数增强式投资,只有少数基金经理会...
全球最大海上风电制氢项目落地广... 1月23日,总投资110.9亿元的宝武清能(阳江)绿氢产业园项目在广东阳江正式启动。项目将建设年产8...
资产总额达32.5万亿元!上海... 上海国资国企改革发展最新部署! 1月23日,2026年上海市国资国企改革发展暨党建工作会议召开。证券...
艾媒咨询:2026年中国新消费... 今天分享的是:艾媒咨询:2026年中国新消费趋势白皮书 报告共计:194页 2026年中国新消费趋势...
山东“毛巾大王”豪送礼包背后:... 山东“毛巾大王”发福利! 1月23日盘后,“毛巾大王”孚日股份(002083.SZ)发布公告称,为庆...
新石器无人车入围《2025年度... 近日,新经济创投数据服务商IT桔子发布了《2025年度中国独角兽企业》系列榜单。新石器无人车凭借在自...
原创 张... 俗话说:坚持到底就是胜利!这句格言恰如其分地概括了清末民初实业家、政治家、教育家张謇的一生。张謇正是...
估值近500亿的美妆IPO要来... 近日,据外媒报道,Goodai Global已敲定11家国内外券商,将其纳入上市主承销商合格候选名单...
马斯克成为“股市发动机”,光伏... 1月23日,港股的光伏板块走势活跃,钧达股份(02865.HK)涨51.4%,信义光能(00968....
浦银经济带崛起混合A:2025... AI基金浦银经济带崛起混合A(519175)披露2025年四季报,第四季度基金利润5.58万元,加权...