1 Lua介绍
Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面。Lua一般用于嵌入式应用,现在越来越多应用于游戏
当中,魔兽世界,愤怒的小鸟都有用到。本次学习是为redis一系列操作做技术储备.
优势:
1、Lua极易嵌入到其他程序,可当做一种配置语言。 2、提升应用性能,比如:游戏脚本,nginx,wireshark的脚本
3、兼容性强,可以直接使用 C 代码写的函数。比如corona 移动应用开发平台,跟PhonePap类似,不过使用Lua做开发语言,应用可以build到iOS,Android,kindle fire,nook平台; 服务器端应该也是Lua。
4、在给软件提供嵌入式脚本编程能力上,Lua是绝佳选择。
Lua脚本的作用:嵌入到应用程序中,给应用程序提供扩展功能。
2 Lua安装
依赖安装: yum install libtermcap-devel ncurses-devel libevent-devel readline-devel pcre-devel gcc openssl openssl-devel
下载安装包: curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz
解压安装: tar zxf lua-5.3.5.tar.gz
安装:
进入解压目录 cd lua-5.3.5 执行安装 make linux test
此时原来系统自带的lua其实是5.1.4,我们需要替换原来系统自带的lua:
rm -rf /usr/bin/lua ln -s /usr/local/server/lua-5.3.5/src/lua /usr/bin/lua
查看版本
3 Lua常用知识
3.1 Lua案例
创建hello.lua文件,内容为
编辑文件hello.lua
vi hello.lua
在文件中输入:print("hello");
保存并退出。
执行命令 lua hello.lua
输出为:
Hello
效果如下:
lua有交互式编程(在控制台编写代码)和脚本式编程(在文件中写代码叫脚本编程)。
交互式编程就是直接输入语法,就能执行。
脚本式编程需要编写脚本,然后再执行命令 执行脚本才可以。
一般采用脚本式编程。(例如:编写一个hello.lua的文件,输入文件内容,并执行lua hell.lua即可)
(1)交互式编程
Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。
Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用:lua -i
如下图:
(2)脚本式编程
我们可以将 Lua 程序代码保持到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程,例如上面入门程序中将
lua语法写到hello.lua文件中。
3.2 Lua语法
注释
一行注释:两个减号是单行注释: --
多行注释:
--[[ 多行注释 多行注释 --]]
定义变量
全局变量,默认的情况下,定义一个变量都是全局变量,
如果要用局部变量 需要声明为local.例如:
-- 全局变量赋值 a=1 -- 局部变量赋值 local b=2
如果变量没有初始化:则 它的值为nil 这和java中的null不同。
如下图案例:
Lua中的数据类型
Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table
。
lua红有个type函数,能出对象的类型。
实例:
print(type("Hello world")) --> string print(type(10.4*3)) --> number print(type(print)) --> function print(type(type)) --> function print(type(true)) --> boolean print(type(nil)) --> nil
3.3 流程控制
3.3.1 if语句
Lua if 语句 由一个布尔表达式作为条件判断,其后紧跟其他语句组成。
语法:
if(布尔表达式) then --[ 在布尔表达式为 true 时执行的语句 --] end
实例:
3.3.2 if…else语句
Lua if 语句可以与 else 语句搭配使用, 在 if 条件表达式为 false 时执行 else 语句代码块。
语法:
if(布尔表达式) then --[ 布尔表达式为 true 时执行该语句块 --] else --[ 布尔表达式为 false 时执行该语句块 --] end
实例:
3.3.3 while循环[满足条件就循环]
Lua 编程语言中 while 循环语句在判断条件为 true 时会重复执行循环体语句。 语法:
while(condition) do statements end 实例: a=10 while( a < 20 ) do print("a 的值为:", a) a = a+1 end
效果如下:
3.3.4 for循环
Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。
语法: 1->10 1:exp1 10:exp2 2:exp3:递增的数量
for var=exp1,exp2,exp3 do <执行体> end
var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 “执行体”。exp3 是可选的,如果不指
定,默认为1。
例子:
for i=1,9,2 do print(i) end
for i=1,9,2 : i=1从1开始循环,9循环数据到9结束,2每次递增2
3.3.5 repeat…until语句
满足条件结束
Lua 编程语言中 repeat…until 循环语句不同于 for 和 while循环,for 和 while 循环的条件语句在当前循环执行开始
时判断,而 repeat…until 循环的条件语句在当前循环结束后判断。
语法:
repeat statements until( condition )
案例:
3 函数
lua中也可以定义函数,类似于java中的方法。例如:
--[[ 函数返回两个值的最大值 --]] 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
..:表示拼接
4 表
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。
案例:
-- 初始化表 mytable = {} -- 指定值 mytable[0]= "Lua" -- 移除引用 mytable = nil
模块
(1)模块定义
模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件
里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。
创建一个文件叫module.lua,在module.lua中创建一个独立的模块,代码如下:
-- 文件名为 module.lua -- 定义一个名为 module 的模块 module = {} -- 定义一个常量 module.constant = "这是一个常量" -- 定义一个函数 function module.func1() print("这是一个公有函数") end local function func2() print("这是一个私有函数!") end function module.func3() func2() end return module
由上可知,模块的结构就是一个 table 的结构,因此可以像操作调用 table 里的元素那样来操作调用模块里的常量或
函数。
上面的 func2 声明为程序块的局部变量,即表示一个私有函数,因此是不能从外部访问模块里的这个私有函数,必须
通过模块里的公有函数来调用.
(2)require 函数
require 用于 引入其他的模块,类似于java中的类要引用别的类的效果。
用法:
require("<模块名>") require "<模块名>"
两种都可以。
我们可以将上面定义的module模块引入使用,创建一个test_module.lua文件,代码如下:
-- test_module.lua 文件 -- module 模块为上文提到到 module.lua require("module") print(module.constant) module.func3()