天天看點

LUA面向對象淺析

--表 元表 元方法結合起來可以實作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}