lua元表

元表 (metatable) 的表现行为类似于C++语言中的操作符重载
setmetatable(table,metatable):此方法用于为一个表设置元表。
getmetatable(table):此方法用于获取表的元表对象。

local function add_fun(self,another)
  local result = {}
  local size = #self
  for i=1,size do
    result[i] = self[i]+another[i]
  end
  return result
end

local function tostring_fun(self)
  local str = ""
  for i in pairs(self)do
    str = str..(self[i]).." "
  end
  return str
end

local mytable1 = {1,2,3}
local mytable2 = {4,5,6}
setmetatable(mytable1, {__add = add_fun})
local mytable3 = mytable1+mytable2
setmetatable(mytable3, {__tostring = tostring_fun})
print(mytable3)
--假如我们想保护我们的对象使其使用者既看不到也不能修改 metatables。我们可以对 metatable 设置了__metatable 的值
setmetatable(mytable3,__metatable)
print(mytable3)


5 7 9 
table: 0x64f5f728


再来一段吧:
print("Lua在创建新的table时不会创建元表:")
local t1={1,2,3}
print(getmetatable(t1))
local t2 = {}
setmetatable(t1,t2)
print(getmetatable(t1))

print("重载加号运算符:")
t1=setmetatable(t1,{
  __add = function(mytable,newtable)
    local sum = 0
    for k,v in pairs(mytable)do
      sum = sum+v
    end
    for k,v in pairs(newtable)do
      sum = sum+v
    end
    mytable["sum"] = sum
    return mytable
  end
  }
)

local t3 = {4,5,6}
local t4 = t1+t3
print(t4.sum)

print("重载减号运算符:")
local mt = {}
mt.__sub=function(table1,table2)
  return table1["value"] - table2["value"]
end

--类似仿函数
mt.__call=function(f,...)
  print("类似仿函数:",...)
end

local tt1 = {value=1}
local tt3 = {value=3}
setmetatable(tt3,mt)
print(tt3-tt1)
print(tt3(6,"a"))

local operator_str = [[
  _add  对应的运算符 '+'.
  __sub 对应的运算符 '-'.
  __mul 对应的运算符 '*'.
  __div 对应的运算符 '/'.
  __mod 对应的运算符 '%'.
  __unm 对应的运算符 '-'.
  __concat  对应的运算符 '..'.
  __eq  对应的运算符 '=='.
  __lt  对应的运算符 '<'.
  __le  对应的运算符 '<='.
]]

Lua在创建新的table时不会创建元表:
nil
table: 0x67a6f240
重载加号运算符:
21
重载减号运算符:
2
类似仿函数:	6	a




猜你喜欢

转载自xiangjie88.iteye.com/blog/2274463
今日推荐