Lua学习笔记(六)

前言

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()   --关闭数据库环境  

—|—

糖果

糖果
LUA教程

Lapis框架的常用处理方法

Lapis框架的常用处理方法 Continue reading

MoonScript实现选择排序

Published on February 26, 2017

MoonScript与Redis客户端

Published on January 19, 2017