Lua:元表(metatable)与元方法(meatmethod)

  local _a1 = {20, 1, key1 = "hello", key2 = "world", lang = "lua"}
  local _a2 = {key1 = "hello",key2 = "world"}

  print("a2的metatable:",getmetatable(_a2))

  setmetatable(_a2, {__index = _a1})
  for _,v in pairs(_a2) do
      print(v)
  end

  print("a2的metatable:",getmetatable(_a2))

  for k,v in pairs(getmetatable(_a2))do
	print(k,v)
	for i,j in pairs(v)do
		print(i,j)
	end
  end

a2的metatable: nil
hello
world
a2的metatable: table: 003CBB20
__index table: 003CAC60
1 20
2 1
key1 hello
lang lua
key2 world

--算术类元方法:字段:__add  __mul  __ sub  __div  __unm  __mod  __pow  (__concat)
--代码:(两个table相加)
tA = {1, 3}
tB = {5, 7}

--tSum = tA + tB

mt = {}

mt.__add = function(t1, t2)
    for k, v in ipairs(t2) do
        table.insert(t1, v)
    end
	return t1
end

setmetatable(tA, mt)

tSum = tA + tB

for k, v in pairs(tSum) do
    print(v)
end

1
3
5
7

--关系类元方法: 字段:__eq __lt(<) __le(<=),其他Lua自动转换 a~=b --> not(a == b) a > b --> b < a a >= b --> b <= a 【注意NaN的情况】
--代码:
mt = {}
function mt.__lt(tA, tB)
    return #tA < #tB
end

tA, tB = {3}, {1, 2}

setmetatable(tA, mt)
setmetatable(tB, mt)
print(tA < tB)

true
 

--用__index/__newindex来限制访问

function cannotModifyHp(object)
    local proxy = {}
    local mt = {
        __index = object,
    __newindex = function(t,k,v)
        if k ~= "hp" then
        object[k] = v
        end
    end
    }
    setmetatable(proxy,mt)
    return proxy
end

object = {hp = 10,age = 11}
function object.sethp(self,newhp)
    self.hp = newhp
end

o = cannotModifyHp(object)

o.hp = 100
print(o.hp)

o:sethp(100)
print(o.hp)

object:sethp(100)
print(o.hp)

10
10
100

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 = Window.prototype

Window.mt.__newindex = function (table ,key ,value)
    if key == "wangbin" then
        rawset(table ,"wangbin" ,"yes,i am")
    end
end

w = Window.new{x = 10 ,y = 20}
w.wangbin = "55"
print(w.wangbin)

yes,i am

原文地址:https://www.cnblogs.com/byfei/p/6389802.html