Lua
Lua 是一个小巧的脚本语言。它是巴西里约热内卢天主教大学三人所组成的研究小组于1993年开发的。 其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。
简单来说:
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
lua 语言具有以下特性:
- 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
- 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
- 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
应用场景:
- 游戏开发
- 独立应用脚本
- Web 应用脚本
- 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
- 安全系统,如入侵检测系统
- redis中嵌套调用实现类似事务的功能
- web容器中应用处理一些过滤 缓存等等的逻辑,例如nginx。
安装
-
安装依赖库
yum install ‐y gcc
yum install libtermcap‐devel ncurses‐devel libevent‐devel readline‐devel
-
在 http://www.lua.org/ftp/ 选择合适版本进行下载,上传到Linux服务器
-
解压
tar zxf lua-5.4.2.tar.gz
-
进入lua目录并安装
cd lua-5.4.2/
make linux
make install
-
启动lua
lua
或者
lua -i
进入了lua界面…
lua程序
lua有交互式编程和脚本式编程。
-
交互式编程
输入
lua
启动lua,直接进行交互输入,输入一句,输出一句。 -
脚本式编程
创建lua脚本 hello.lua
print("hello world") if(0) then print("0 为 true") else print("0 不为true") end
执行lua脚本
lua hello.lua
输出结果:
[root@instance lua-script]# lua hello.lua hello world 0 为 true
1.数据类型及变量
Lua 是动态类型语言,变量**不用类型定义**
(和python类似),只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。
(可以使用函数type()查看该值类型)
-
nil
只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
未定义的值,直接查询,输出nil
> c nil
-
boolean
包含两个值:false和true。
a=true
-
number
表示双精度类型的实浮点数
a=10
-
string
字符串由一对双引号或单引号来表示
s="string1"
-
function
由 C 或 Lua 编写的函数
function fun() print("aaa") end
-
userdata
表示任意存储在变量中的C数据结构.userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
-
thread
表示执行的独立线路,用于执行协同程序.
在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
-
table
Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。-- 创建一个空的 table local tbl1 = {} -- 直接初始表 local tbl2 = {"apple", "pear", "orange", "grape"} -- 单独赋值 table[1]=99 --移除定义 table[1]=nil array = {"Lua", "Tutorial"} for i= 0, 2 do print(array[i]) end
变量分为全局变量
和局部变量
-
全局变量
a=3 --一般都是定义的全局变量
-
局部变量
> local a=3 > a nil
函数也有局部的
loacl function max() end
2.注释
- 单行注释
--
- 多行注释
--[
这里是注释
还是注释
--]
3.流程控制
-
if
‐‐[ 0 为 true ] if(0) then print("0 为 true") else print("0 不为true") end
-
while
-- 谨慎输入 while( true ) do print("循环将永远执行下去") end
-
for
for a= 1,10 do print(a) end
-
break
--[ 定义变量 --] a = 10 --[ while 循环 --] while( a < 20 ) do print("a 的值为:", a) a=a+1 if( a > 15) then --[ 使用 break 语句终止循环 --] break end end
-
goto
编写lua脚本
vi hello.lua
local a = 1 ::label:: print("--- goto label ---") a = a+1 if a < 3 then goto label -- a 小于 3 的时候跳转到标签 label end
执行lua脚本,结果:
[root@instance lua-script]# lua hello.lua --- goto label --- --- goto label ---
有了 goto,我们可以实现 continue 的功能:
for i=1, 3 do if i <= 2 then print(i, "yes continue") goto continue end print(i, " no continue") ::continue:: print([[i'm end]]) end
执行结果:
[root@instance-c9m0dcrw lua-script]# lua hello.lua 1 yes continue i'm end 2 yes continue i'm end 3 no continue i'm end
4.函数function
--[[ 函数返回两个值的最大值 --]] function max(num1, num2) if (num1 > num2) then result = num1; else result = num2; end return result; end -- 调用函数 print("两值比较最大值为 ",max(10,4)) print("两值比较最大值为 ",max(5,6))
结果:
两值比较最大值为 10 两值比较最大值为 6
5.模块
moduel.lua脚本
-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
-- 定义一个常量
module.constant = "这是一个常量"
-- 定义一个函数
function module.func1()
io.write("这是一个公有函数!\n")
end
local function func2()
print("这是一个私有函数!")
end
function module.func3()
func2()
end
return module
test_module.lua 文件
-- test_module.lua 文件
-- module 模块为上文提到到 module.lua
require("module")
--module 模块的常量
print(module.constant)
--module 模块的v
module.func3()
n.其他
::label:: 是标签
.. 表示拼接,例如 print("a是"..a)