--表 元表 元方法結合起來可以實作lua面向對象的機制
--lua中通過原型的思路才使用實作對象的執行個體化機制
--一個原型表可以用來描述一個類 在原型表中填寫屬性和方法
--執行個體化對象,建立一個新表,将新表的元表設定為原型表.将原型表的__index指向自身
--類似js的面向對象機制
function Human(name)
local this={ name=name, a=1, b=2, c=3, d=4 }
this.eat=function(food)
print(this.name.." eats "..food)
end
this.add=function(n)
this.a,this.b,this.c,this.d=this.a+n,this.b+n,this.c+n,this.d+n
end
this.getName=function()
print("my name is "..this.name)
end
this.print=function()
print(this.a,this.b,this.c,this.d)
end
return this
end
a=Human("Hover")
b=Human("Lees")
a.eat("meat bun")
b.eat("sweet bun")
a.add(1)
b.add(2)
a.getName()
a.print()
b.getName()
b.print()
--[[
my name is Hover
2 3 4 5
my name is Lees
3 4 5 6
]]
--LUA中内置的面向對象的機制
Set={}
local mt={}
function Set.new(l)
local set={}
setmetatable(set,mt)--設定對象的元表 之後通過對元表的操作來使對象具有其他的操作行為
for _,v in ipairs(l) do
set[v]=true
end
return set
end
function Set.union(a,b)
local res=Set.new{}
for k in pairs(a) do
res[k]=true
end
for k in pairs(b) do
res[k]=true
end
return res
end
function Set.intersection(a,b)
local res=Set.new{}
for k in pairs(a) do
res[k]=b[k]
end
return res
end
function Set.tostring(set)
local l={}
for e in pairs(set) do
l[#l+1]=e
end
return "{"..table.concat(l,",").."}"
end
function Set.print(s)
print(Set.tostring(s))
end
s1=Set.new{10,20,30,40}
s2=Set.new{10,50}
print(Set.print(Set.union(s1,s2)))
結果為:{20,10,40,30,50}