Lua学习笔记(六)

3k 词

前言

Lua的基础教程其实感觉都已经快接近尾声了,这次就直接把面向对象的这个部分以及一些其他的东西讲清楚,然后就结尾吧,其实大部分编程语言的内涵都是共通的,最主要的还是应用的问题。(只有实践才是检验真理的唯一标准!)

正文

推荐网站

Lua在线手册

Lua进程设计

这两个网站都是关于Lua语言的chm文档,可以参考学习,特别是第二个网站,十分的丰富。

面向对象

这里的“对象”不是那个“对象”,学过C++或者Java这种面向对象语言的人肯定知道,Lua也是面向对象的,其实之前就说过Lua中其实都是对象。

四大特征

封装

指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。

继承

继承的方法允许在不改动原进程的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。

多态

同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

抽象

抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。

如何使用

对象包括两个内容:属性+方法。前者使用Lua中的table表示,后者使用function表示。(继承可以通过metetable来模拟,事实上,模拟基本的对象大多时候都已经足够使用了)

另外,由于Lua中所有都是对象,是以,table其实也是对象,也有状态(成员变量以及成员函数)

实例如下:

1
2
3
4
5
6
7
8
9
10
11
12
--这里直接定义一个表table,其中包含了它的成员变量num
test={num=0}
--下面直接定义test对应的成员函数
function test.addNum(count)
test.num=test.num+count
end

print("第一个:"..test.num)

test.addNum(10)

print("第二个:"..test.num)

结果:

创建对象

这个过程其实就是为类的实例分配内存。

1
2
--如果该类需要传入初始参数就通过小括号内传入
test1=test:new();
访问属性

直接使用.来访问。

1
test1.num;
访问成员函数
1
test1:addNum(1);
完整实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- Meta class
Shape = {area = 0}

-- 基础类方法 new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end

-- 基础类方法 printArea
function Shape:printArea ()
print("面积为 ",self.area)
end

-- 创建对象
myshape = Shape:new(nil,10)

myshape:printArea()

输出:

1
面积为 	100
继承

继承的含义是——一个对象直接使用另外一个对象的属性方法之类。一般的作用就是扩展基类的属性与方法。使用场景举例:Person类下面或许就可以被继承一个Student类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
-- Meta class
Shape = {area = 0}
-- 基础类方法 new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- 基础类方法 printArea
function Shape:printArea ()
print("面积为 ",self.area)
end

-- 创建对象
myshape = Shape:new(nil,10)
myshape:printArea()

Square = Shape:new()
-- 派生类方法 new
function Square:new (o,side)
o = o or Shape:new(o,side)
setmetatable(o, self)
self.__index = self
return o
end

-- 派生类方法 printArea
function Square:printArea ()
print("正方形面积为 ",self.area)
end

-- 创建对象
mysquare = Square:new(nil,10)
mysquare:printArea()

Rectangle = Shape:new()
-- 派生类方法 new
function Rectangle:new (o,length,breadth)
o = o or Shape:new(o)
setmetatable(o, self)
self.__index = self
self.area = length * breadth
return o
end

-- 派生类方法 printArea
function Rectangle:printArea ()
print("矩形面积为 ",self.area)
end

-- 创建对象
myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()

输出结果:

1
2
3
面积为     100
正方形面积为 100
矩形面积为 200
重写

Lua中支持直接重写基础类的函数,在派生类中定义自己的实现方式。

实例其实就是上面一个例子中的。

数据库

Lua支持的数据库:LuaSQL,支持的类型包括ODBC, ADO, Oracle, MySQL, SQLite 和 PostgreSQL。

LuaSQL可使用LuaRocks安装需要的数据库驱动。

WIndows安装LuaRocks的方法教程

简单实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
require "luasql.mysql"

--创建环境对象
env = luasql.mysql()

--连接数据库
conn = env:connect("数据库名","用户名","密码","IP地址",端口)

--设置数据库的编码格式
conn:execute"SET NAMES UTF8"

--执行数据库操作
cur = conn:execute("select * from role")

row = cur:fetch({},"a")

--文档对象的创建
file = io.open("role.txt","w+");

while row do
var = string.format("%d %sn", row.id, row.name)

print(var)

file:write(var)

row = cur:fetch(row,"a")
end


file:close() --关闭文档对象
conn:close() --关闭数据库连接
env:close() --关闭数据库环境