feixiong 发表于 2012-2-20 20:01:06

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

在很多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

littleknife 发表于 2012-2-20 20:10:06

本帖最后由 littleknife 于 2012-2-20 08:12 PM 编辑

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

local function checkvalue(value,t)
if value==nil then return false end
local res=false
for k,v in pairs(t) do
   if v==value then
    res=true
   break
   end
end
return res
end
function table_union(a,b)
local res={}
if a==nil or a==b then
    return b
end
if b==nil then
    return a
end
    for k,v in pairs(a) do table.insert(res,v) end
    for _,value in pairs(b) do
if checkvalue(value,a)==false then
table.insert(res,value)
end
end
    return res
end

求交集:

function table_intersection (a,b)
local res={}
if a==nil then
    return b
end
if b==nil then
    return a
end
    for _,r in ipairs(a) do
for _,t in ipairs(b) do
      if r==t then
   table.insert(result,r)
   break
   end
end
end
if res==nil then
print(":交集为空:")
res={}
end
return res
end

feixiong 发表于 2012-2-21 07:05:32

回复 2# littleknife


    受教,duo多谢

sizak 发表于 2012-2-21 09:20:26

学习ing

xspe 发表于 2012-4-4 02:37:20

littleknife能做个标注吗?还是没看懂
页: [1]
查看完整版本: LUA傻瓜式学习笔记与疑问4