一.引言
最近又开始折腾Lua了,说实话以前没有把Lua看成什么高深的语言,一直把他当做是配合宿主程序的所谓的“脚本”(虽然事实的确如此),不过最近看了一些Lua代码才发现,原来Lua可以通过很简单巧妙的变化,模拟出一些其他语言引以为傲的特性,真没想到Lua还可以这样玩,哈哈。
目前主流的编程语言C++/C#/Java都是面向对象的语言,面向对象符合我们正常的思维观念,面向对象的特性,封装,继承等更是可以大大的帮助我们提升编程的效率。比如我们要写一系列的人物对象,每个对象的基础方法都相同,只是有一些特有的方法和字段,如果没有面向对象,我们可能就要“Ctrl+C”,"Ctrl+V"了,这可是写代码的大忌啊。所以机智的先人们早就想好了怎么让Lua面向对象了。
不过在学习怎么让Lua面向对象之前,还要学习一点预备知识,因为这个东东才是让Lua能够面向对象的秘密武器。
二.元表&元方法
1.元表(metatable)简介
元表是Lua中很重要的一个概念,所谓元表(metatable),就是对应一个类型最基本的一些方法的集合,这些方法叫做元方法(metamethod)。
举个例子来说明一下。比如+方法,我们给两个数进行加法运算,系统就会自己调用数的__Add元方法进行加法操作。我们并没有定义这个方法,
但是Lua会去数的元表里找到_Add进行加法运算。
Lua中,我们定义一个table时,是不会自动生成元表的。
_G.Base = {}
Base.name = "Base"
function Test()
print(getmetatable(Base));
end
Test()
结果:
nil
我们可以通过setmetatable方法来给table设置元表。看一个例子:
Set = {}
--创建新的Set
function Set.new(l)
local set = {}
for _,v in ipairs(l) do
set[v] = true
end
return set
end
--打印传入的Set
function Set.Print(s)
for e in pairs(s) do
print(tostring(e))
end
end
--Union方法,合并两个Set
function Set.Union(a,b)
local newSet = {}
for e in pairs(a) do newSet[e] = true end
for e in pairs(b) do newSet[e] = true end
return newSet;
end
s1 = Set.new{1,2,3}
s2 = Set.new{4,5,6}
Set.Print(s1) --输出1,2,3
Set.Print(s2) --输出4,5,6
newS = Set.Union(s1,s2)
Set.Print(newS) --输出1,2,3,4,5,6
这是一个合并两个集合的代码,调用方式比较麻烦,有没有类似C+&