北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 4520|回复: 4

LUA傻瓜式学习笔记与疑问4

[复制链接]
发表于 2012-2-20 20:01:06 | 显示全部楼层 |阅读模式
在很多LUA编写的脚本中大量出现了元表这个概念,我看了很多次书册等书,还是有点迷茫
下面是我看的半懂的,希望有高手能深刻而通俗的解释给我最好能带上PKUXKX的例子,谢谢

lua metatable(以下简称元表)类似c++的operator overloads,可以对复合结构进行操作,在lua里最常见的就是对表的操作.举例来说,当两个表作加法操作的时候,Lua会检查表的元表中是否有”__add”事件是否对应一个函数(metamethod)。如果存在Lua会调用这个函数来执行一次表的加法操作.

__index和__newindex是表常常要添加的事件,用于处理键值在表无法被查找到之后的处理.

hoterran@~/Projects/lua$ cat meta_test.lua
t = {}
t.a = 1

print(t.a)
print(t.b)
setmetatable(t, {__index = function(x) return "test" end})
print(t.b)

hoterran@~/Projects/lua$ lua meta_test.lua
1
nil
test可见当键值”b”在表内无法查找到之后会调用__index事件对应的匿名函数

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2012-2-20 20:10:06 | 显示全部楼层
本帖最后由 littleknife 于 2012-2-20 08:12 PM 编辑

其实对于表的合并和求交集,不需要用到元表也能做到:
求并集:

  1. local function checkvalue(value,t)
  2.   if value==nil then return false end
  3.   local res=false
  4.   for k,v in pairs(t) do
  5.    if v==value then
  6.     res=true
  7.    break
  8.    end
  9.   end
  10.   return res
  11. end
复制代码
  1. function table_union(a,b)
  2. local res={}
  3. if a==nil or a==b then
  4.     return b
  5. end
  6. if b==nil then
  7.     return a
  8. end
  9.     for k,v in pairs(a) do table.insert(res,v) end
  10.     for _,value in pairs(b) do
  11.   if checkvalue(value,a)==false then
  12.   table.insert(res,value)
  13.   end
  14. end
  15.     return res
  16. end
复制代码

求交集:

  1. function table_intersection (a,b)
  2. local res={}
  3. if a==nil then
  4.     return b
  5. end
  6. if b==nil then
  7.     return a
  8. end
  9.     for _,r in ipairs(a) do
  10.   for _,t in ipairs(b) do
  11.       if r==t then
  12.      table.insert(result,r)
  13.      break
  14.    end
  15.   end
  16. end
  17. if res==nil then
  18.   print(":交集为空:")
  19.   res={}
  20. end
  21. return res
  22. end
复制代码
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2012-2-21 07:05:32 | 显示全部楼层
回复 2# littleknife


    受教,duo多谢
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2012-2-21 09:20:26 | 显示全部楼层
学习ing
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2012-4-4 02:37:20 | 显示全部楼层
littleknife能做个标注吗?还是没看懂
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-17 11:46 AM , Processed in 0.010905 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表