Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
因为我们使用redis的时候一般要写lua脚本,这篇文章就介绍一下lua脚本语言的基础用法。
一、安装Lua
window操作系统下可以使用SciTE来执行lua程序,SciTE是一个代码编辑器和集成开发环境,类似IntelliJ IDEA。点击以下链接下载SciTE:
https://github.com/rjpcomputing/luaforwindows/releases
点击上方链接打开页面,点击红框内链接下载SciTE
这是github的链接,可能访问很慢或者无法访问,可以通过以下网盘链接下载。
下载Luahttps://pan.baidu.com/s/1lsWURBHR2gmFvD0uL6xplw?pwd=yxzv安装过程很简单,一直下一步就行了,注意在安装过程中勾选创建桌面快捷方式。
安装后,桌面多了一个图标
鼠标双击这个快捷方式打开SciTE,第一次打开的时候页面是这样的,我们在下面空白的地方输入以下代码
print("Hello world");
然后Ctrl+S保存当前文件,文件名设置成hello.lua,为了方便,把这个文件保存到桌面
保存之后,发现第二排的工具栏图标多了一个运行按钮,点击它就可以运行代码了
好了,上面已经介绍了SciTE这款代码编辑器的使用,接下来介绍lua语言的基础语法。
二、lua基础语法
1、代码注释
lua支持单行注释和多行注释
单行注释的写法
--这是注释
多行注释的写法
--[[
这是多行注释
这是多行注释
这是多行注释
--]]
2、标识符
lua语言的标识符命名规则和其他语言类似
- 变量名以字母或下划线 _ 开头,只能包含字母、数字和下划线。
- 最好不要使用下划线加大写字母的标示符,因为Lua的保留字就是这样命名的。
- 一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于Lua内部的全局变量。
3、关键字
下面是Lua的保留关键字,保留关键字不能作为常量或变量或其他用户自定义标示。
and | break | do | else |
elseif | end | false | for |
function | if | in | local |
nil | not | or | repeat |
return | then | true | until |
while | goto |
4、变量的定义
lua中的变量定义不像java要声明类型,只需要写:变量名=变量值;在这一点上,lua和python是一样的。
全局变量:lua中的变量默认是全局的,比如
str = "Hello world";
print(str);
局部变量:使用local关键字修饰的变量,比如
func = function()
local a = 1;
end;
print(a);
这个时候a是访问不到的,相当于未定义的变量,而我们lua是允许访问未定义的变量的,只是值为nil,类似java的null。
5、变量的赋值
lua中变量的赋值也是用等号,但是lua支持一次给多个变量赋值。
例如,同时给a、b、c赋值
a, b, c = 1, 2, 3;
print(a);
print(b);
print(c);
变量和值的顺序一一对应,这样的话,就有可能变量的个数和值的个数不一致
- 当变量的个数>值的个数时,没有赋值的对应变量的值默认为nil,这点倒是和java很像
- 当变量的个数<值的个数时,多余的值会被忽略;
注意:lua的字符串拼接和java不一样,lua使用..来拼接两个字符串。例如:
a = "Hello ";
print(a .. "world");
因为Lua赋值语句会先计算右边所有的值然后再执行赋值操作,所以我们可以这样交换变量的值:
a = 1;
b = 2;
a, b = b, a;
print("a = " .. a);
print("b = " .. b);
代码运行结果:
6、数据类型
lua中有八大数据类型,作为初学者,我们能用上的也就只有:nil、boolean、string、function、table
数据类型 | 描述 |
---|---|
nil | 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。 |
boolean | 包含两个值:false和true。 |
number | 数字类型,包含整数和小数 |
string | 字符串,由一对双引号或单引号来表示 |
function | 函数 |
userdata | 表示任意存储在变量中的C数据结构 |
thread | 表示执行的独立线路,用于执行协同程序 |
table | Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。 |
可以通过type()函数来获取变量的类型,例如:
a = 1;
b = "abc";
c = function()
print("这是函数");
end;
d = true;
e = {name = "Marry", age = 18};
print(type(a));
print(type(b));
print(type(c));
print(type(d));
print(type(e));
以上代码的运行结果:
6.1 function的说明
- 函数和变量一样,可以指定作用域,不指定则默认为全局函数,可以使用local关键字设置为局部函数
- Lua的函数可以接受可变数目的参数,在函数的参数列表中使用...表示函数有可变的参数。当参数中有固定参数和可变参数时,可变参数要放到最后。
func = function(...)
for k, v in pairs(...)
do
print(v);
end;
end;
func({"a", "b", "c"});
- 函数可以返回多个值,每个值以逗号隔开
- function可以作为函数的参数传递
func = function(a, fun)
print(q);
fun();
end;
func(a, function()
print("函数作为参数传递");
end);
6.2 table的介绍
其他4种数据类型很简单,主要是介绍一下table,这个类似数组,又类似对象的数据类型。
table的写法:{field = value, field2 = value2}
当然,table可以是一个镶嵌的结构,里面的值也可以是一个table
tab = {name = "Tom", age = 18, hobby = {"eat", "drink", "sleep"}}
案例代码: 注意,table的下标是从1开始的
table里面的字段可以通过两种方式获取:
- 变量名[字段名]
- 变量名.字段名
tab = {name = "Marry", age = 18};
print(tab[name]);
print(tab.name);
print(tab[age]);
print(tab.age);
代码运行结果:
6.3 table的遍历
tab = {name = "Marry", age = 18};
for k, v in pairs(tab)
do
print("k = " .. k);
print("v = " .. v);
end;
7、循环结构
for循环
语法格式
for var = exp1, exp2, exp3
do
-- 循环体
end;
变量var从exp1变化到exp2,每次变化以 exp3 为步长递增var,并执行一次循环体。
exp3 是可选的,如果不指定,默认为1。
例如:
-- 打印1到10
for a = 1, 10, 1
do
print(a);
end;
补充:泛型for循环
泛型for循环通过迭代器函数pairs()或ipairs()来遍历所有值,类似 java 中的 foreach 语句。
Lua 编程语言中泛型 for 循环语法格式:
-- 输出所有水果
fruits = {"apple", "banana", "pineapple", "pear", "watermalon", "plum", "cherry", "kiwi fruit", "strawberry"}
for i, v in ipairs(fruits ) do
print(i, v)
end;
while循环
语法格式:
while(condition)
do
statements
end;
do while循环
语法格式:
repeat
statements
until(condition);
8、分支结构
if...else语句
if(布尔表达式)
then
--[布尔表达式为true时执行该语句块--]
else
--[布尔表达式为false时执行该语句块--]
end;
if...else if...else语句
if(布尔表达式1)
then
--[ 在布尔表达式1为true时执行该语句块--]
elseif(布尔表达式2)
then
--[ 在布尔表达式2为true时执行该语句块--]
elseif(布尔表达式3)
then
--[在布尔表达式3为true时执行该语句块--]
else
--[如果以上布尔表达式都不为true则执行该语句块--]
end;
9、lua常用函数
print():在控制台输出指定的值,该函数可以有多个参数。
string.find():返回匹配串开始和结束的下标,如果不存在匹配串返回nil。
start, finish = string.find("hello world", "hello");
print(start, finish); -- 1 5
select("#", ...):获取可变参数的长度
-- 获取参数个数
function getLength(...)
return select("#", ...);
end;
print(getLength("a", "b", "c", "d", "e"));
select(n, ...):返回从起点n开始到结束位置的所有参数列表。
print(select(3, "a", "b", "c", "d", "e")); -- c d e
10、算术运算符
lua相对于java多了一个整除运算符
操作符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 取余 |
^ | 乘幂 |
- | 负号 |
// | 整除运算符(>=lua5.3) |
11、关系运算符
lua相对于java,不等于的运算符有一点区别
- Java中不等于是!=
- Lua中的不等于是~=
操作符 | 描述 |
---|---|
== | 等于,检测两个值是否相等,相等返回 true,否则返回 false |
~= | 不等于,检测两个值是否相等,不相等返回 true,否则返回 false |
> | 大于,如果左边的值大于右边的值,返回 true,否则返回 false |
< | 小于,如果左边的值大于右边的值,返回 false,否则返回 true |
>= | 大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false |
<= | 小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false |
12、逻辑运算符
操作符 | 描述 |
---|---|
and | 逻辑与操作符。 若 A 为 false,则返回 A,否则返回 B。 |
or | 逻辑或操作符。 若 A 为 true,则返回 A,否则返回 B。 |
not | 逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。 |
13、其他运算符
操作符 | 描述 |
---|---|
.. | 连接两个字符串 |
# | 一元运算符,返回字符串或表的长度。 |