Lua基础学习
一、lua简介
Lua [1] 是一个小巧的脚本语言。它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo三人所组成的研究小组于1993年开发的。 其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。
Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。 [2] Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。 [2] 一个完整的Lua解释器不过200k,在所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。 [2]
保存和运行
运行可以通过 Lua 的交互模式,也可以用记事本编辑代码保存为 .lua 的格式,通过 Lua 编译器运行。也可以通过第三方工具,将 Lua 打包独立运行。
目标
Lua的目标是成为一个很容易嵌入其它语言中使用的语言。大多数程序员也认为它的确做到了这一点。
很多应用程序、游戏使用LUA作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。这其中包括魔兽世界、博德之门、愤怒的小鸟、QQ三国、VOCALOID3、Garry’s Mod、太阳神三国杀、游戏王ygocore和饥荒等。
特性
轻量级
Lua语言的官方版本只包括一个精简的核心和最基本的库。这使得Lua体积小、启动速度快,从而适合嵌入在别的程序里。5.0.2版的Lua的内核小于120KB,而Python的内核大约860KB,Perl的内核大约1.1MB。 [3]
可扩展
Lua并不象其它许多"大而全"的语言那样,包括很多功能,比如网络通讯、图形界面等。但是Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
其它特性
Lua还具有其它一些特性:同时支持面向过程(procedure-oriented)编程和函数式编程(functional programming);自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程 [4] ,并非操作系统所支持的线程)支持;通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
应用场景
- 游戏开发 [1]
- 独立应用脚本
- Web 应用脚本
- 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
- 安全系统,如入侵检测系统
二、lua源码下载
访问Lua的官方网站 www.lua.org
三、编译
linux环境
a. 将lua-5.3.5.tar.gz进行解压
b.进入lua-5.3.5目录
c.编译,如果只输入make的话,会提示选择操作的平台,此处是linux;所以输入make linux;
如果是mac 则输入make macosx;根据自己的操作系统选择
tar -zxvf lua-5.3.5.tar.gz
cd lua-5.3.5
make linux
d.编译生成可执行文件lua和luac
四、基本语法
--控制台打印
--print("Hello lua")
--全局可见变量
--num = 100
--print(num)
--局部变量
--local num = 100
--print(num)
--定义一个局部的main方法
--local function main()
-- print("hasdjkafjn as")
--end
--main()
--定义一个方法
--function sayHello()
-- print("csac")
--end
--调用方法
--sayHello()
--定义一个带参数的方法
function maxNum(a,b)
if a>b then
return a
else
return b
end
end
--调用方法
print(maxNum(3,5))
--循环(包括1和100)
for var=1,100 do
print(var)
end
数据类型
关键字
运算符
and: 只含逻辑运算时,所有为真才为true;含其他类型混合逻辑类型时,从左往右运算,如果前面为真,输出为最后一个
函数
五、表
Config = {hello = "Hello",world = "World"}
Config.words = "words"
Config.num = 100
Config["name"] = "Zhangsan"
--print(Config["num"])
--print(Config.words)
--print(Config.name)
--遍历表
for key,var in pairs(Config) do
print(key,var)
end
六、数组
arr = {1,2,3,"Hello"}
--key是数组的索引,索引是从1开始不是0
--初始化的时候直接填入value就行,不用想table一样需要键值对
for key,var in pairs(arr) do
print(key,var)
end
--输出数组的长度
print(#arr)
--遍历数组
for i=1,#arr,1 do
print(arr[i])
end
arr = {}
--利用循环初始化
--table.insert需要传入3个参数
--第一个是表名;第二个是key索引值;第三个是value
for var=1,100 do
table.insert(arr,var,var+1)
end
for key,var in pairs(arr) do
print(key,var)
end
--数组的长度
print(table.maxn(arr))
--删除数组的值,只需要输入索引weizhi
table.remove(arr,100)
七、对象
People = {}
function People.sayHi()
print("People say Hi !")
end
People.sayHello = function()
print("People say Hello !")
end
People.sayHello()
People.sayHi()
--克隆一个表或对象
function clone(tab)
local ins = {}
for key, var in pairs(tab) do
ins[key] = var
end
return ins
end
People = {}
function People.sayHi()
print("People say Hi !")
end
People.sayHello = function()
print("People say Hello !")
end
People.sayHi()
People.sayHello()
print("---------------------------------")
p = clone(People)
p.sayHello()
p.sayHi()
People = {}
-- ..表示字符串拼接
function People.sayHi(self)
print("People say Hi: "..self.name)
end
--构造方法
People.new = function(name)
local self =clone(People)
self.name = name
return self
end
--克隆一个表或对象
function clone(tab)
local ins = {}
for key, var in pairs(tab) do
ins[key] = var
end
return ins
end
local p = People.new("zhangsan")
p.sayHi(p)
p:sayHi() --等同于p.sayHi(p),冒号默认的把实例参数传进去
--复制
function copy(dist,tab)
for key,var in pairs(tab) do
dist[key] = var
end
end
Man = {}
Man.new = function(name)
local self = People.new(name)
copy(self,Man)
return self
end
Man.sayHello = function()
print("Man say Hello !")
end
local m = Man.new("Lisa")
m:sayHi()
--重写方法
Man.sayHi = function(self)
print("Man say Hi: "..self.name)
end
local m = Man.new("Lisa")
m:sayHi()
--控制台输出Man say Hi: Lisa
--闭包式面向对象
function People(name)
--局部变量,外部不可访问
local self = {}
--私有方法,外界不可访问
local function init()
self.name = name
end
self.sayHi = function()
print("Hello "..self.name)
end
init()
return self
end
local p = People("Zhangsan")
p:sayHi()
--继承People
function Man(name)
local self = People(name)
self.sayHello = function()
print("Hello "..self.name)
end
return self
end
local m = Man("Lisa")
m:sayHello()
--控制台输出Hello Lisa