在中学教程的上半部分咱们介绍了Redis Lua相关的命令,没有看过或者忘记的同窗能够步行前往直接使用机票Redis Lua脚本中学教程(上)。今天咱们来简单学习一下Lua的语法。html
在介绍Lua语法以前,先来介绍一下Lua的身世。Lua是由简称为PUC-Rio的团队设计、开发和维护的。Lua在葡萄牙语中是月亮的意思,因此它不是简写,而是一个名词。因此只能写成Lua,而不能写成LUA或者其余什么的。接下来咱们正式入门Lua。git
变量名能够是由字母、数字和下划线组成的字符串,但不能以数字开头。另外须要注意的是,须要尽可能避免使用下划线加一个或多个大写字母格式的变量名,由于这是Lua的保留字,除了这种格式之外,还有一些普通格式的保留字:github
and | break | do | else | elseif |
---|---|---|---|---|
end | false | for | function | goto |
if | in | local | nil | not |
or | repeat | return | then | true |
until | while |
Lua是大小写敏感的,and是保留字,但And和AND不是。编程
前面咱们提到过Redis不支持Lua的全局变量,但Lua自己是支持全局变量的。数组
全局变量不须要声明,直接一个未初始化的变量时,它的值是nil。函数
> b --> nil
> b = 10
> b --> 10
复制代码
若是显示的将nil赋值给某个全局变量,Lua会认为咱们再也不使用这个变量。学习
Lua的变量默认是全局变量,局部变量须要显示声明。局部变量能够避免增长没必要要的名称来混淆全局环境,同时也能避免两部分代码的命名冲突。另外,访问局部变量要比访问全局变量的速度更快。ui
局部变量的使用范围是有限制的,只在它声明的块中可用。(块能够是控制结构体或函数体或者是整个文件中)lua
x = 10
local i = 1 -- local to the chunk
while i <= x do
local x = i * 2 -- local to the while body
print(x) --> 2, 4, 6, 8, ...
i = i + 1
end
if i > 20 then
local x -- local to the "then" body
x = 20
print(x + 2) -- (would print 22 if test succeeded)
else
print(x) --> 10 (the global one)
end
print(x) --> 10 (the global one)
复制代码
在交互模式下,每次输入都是一块代码,当你输入local i = 1时,就定义了一个局部变量i,而当你在下一行使用i时,发现它又成了全局变量。所以上面的栗子就不能用了。为了解决这个问题,咱们须要在程序中显式的使用do-end标记代码块的范围。spa
local x1, x2
do
local a2 = 2*a
local d = (b^2 - 4*a*c)^(1/2)
x1 = (-b + d)/a2
x2 = (-b - d)/a2
end -- scope of 'a2' and 'd' ends here
print(x1, x2) -- 'x1' and 'x2' still in scope
复制代码
使用这种方式标记代码块范围是一种良好的习惯,而使用局部变量编程也要优于使用全局变量,所以有不少人呼吁Lua默认应该定义局部变量,可是这样也会存在问题。最好的解决方案是不要默认,使用全部的变量以前都要声明。
Lua有一个常见的习语:
local foo = foo
复制代码
这里定义了一个局部变量foo,并把全局变量foo的值赋给局部变量。这一习语主要用来提高变量foo的访问速度,或者对变量进行暂存,防止其余函数改变这个变量的值。
Lua的单行注释使用双横线“--”表示,双横线后的内容为注释内容。
多行注释的一种表现是以双横线加双左中括号开始,以双右中括号结束。例如:
--[[A multi-line long comment ]]
复制代码
不过一般咱们使用另外一种写法:以双横线加双左中括号开始,以双横线加双右中括号结束,这种写法看起来更加美观,同时解注释也更加方便:
--[[ print(10) -- no action (commented out) --]]
复制代码
解注释
---[[
print(10) --> 10
--]]
复制代码
这里稍微解释一下这种写法的原理,注释时,后一组双横线在注释内容中,所以不起做用,只为了对称,效果和普通多行注释同样。而解注释时,第一组双横线前又加了一个横线,就不能认为是多行注释了,只能当作单行注释,所以,第一行被注释掉了,这时后一组双横线就会起做用了,注释掉后面的双右中括号。
Lua是一种动态类型语言,它有8种基本类型:nil,Boolean,number,string,userdata,function,thread和table。type函数能够返回指定值的类型:
> type(nil) --> nil
> type(true) --> boolean
> type(10.4 * 3) --> number
> type("Hello world") --> string
> type(io.stdin) --> userdata
> type(print) --> function
> type(type) --> function
> type({}) --> table
> type(type(X)) --> string
复制代码
Nil类型的值只有一种,就是nil,它是一种没有值的表现。
Boolean类型有两种取值,@false{} and @true{}。可是Boolean类型并不能囊括全部的条件值:在条件判断时,Lua会将false和nil判断为假,其余的都判断为真。
画外音:Lua把0和空字符串也判断为真,这点感受设计的不太好啊
and、or和not是Lua的逻辑运算符。
and的运算方法是,判断第一个操做数是否是false,若是不是,结果就是第二个操做数。
or的运算方法是,判断第一个操做数是否是真,若是不是,结果就是第二个操做数。
> 4 and 5 --> 5
> nil and 13 --> nil
> false and 13 --> false
> 0 or 5 --> 0
> false or "hi" --> "hi"
> nil or false --> false
复制代码
Table是Lua中主要的(也是惟一的)结构化数据表现类型。它能够用来表现不少种数据类型,如数组、集合、记录等。
每一个表的key能够是不一样类型的,对于未定义索引的表元素,它的默认值是nil。和其余大部分语言不一样的是Lua中表的下标是从1开始的。
Table有两种格式:record-style和list-style
record-style能够直接用"."访问,list-style能够用下标来访问。定义时能够一块儿定义。
polyline = {color="blue",
thickness=2,
npoints=4,
{x=0, y=0},
{x=-10, y=0},
{x=-10, y=1},
{x=0, y=1}
}
复制代码
当咱们访问一个可能为空的Table,每每须要先判断非空
if lib and lib.foo then ....
复制代码
使用这种方式访问结构比较深的表示就会很是痛苦:
zip = company and company.director and
company.director.address and
company.director.address.zipcode
复制代码
Lua没有像C#同样提供?.这样的操做,不过咱们可使用or {}的形式来处理。
zip = (((company or {}).director or {}).address or {}).zipcode
复制代码
Lua提供了一些基本的流程控制语句:
Lua中函数能够接收的参数是list,若是没有参数,也须要写一对空的括号"()"(一句废话)。若是只有一个参数,则括号可写可不写。Lua还提供了一种特殊的函数访问方法,有兴趣的话能够参考https://www.lua.org/pil/16.html
o:foo(x)
复制代码
Lua程序中既可使用定义在Lua中的函数,也可使用定义在C语言中的函数。
Lua函数有一个很是方便的特性:能够返回多个结果。
function maximum (a)
local mi = 1
local m = a[mi]
for i = 1, #a do
if a[i] > m then
mi = i; m = a[i]
end end
return m, mi
end
print(maximum({8,10,23,12,5})) --> 23 3
复制代码
Lua能够自动调整返回结果的数量,当函数做为语句调用时,会舍弃全部返回值;当函数做为表达式调用时,只保留第一个返回值;若是要得到所有返回值,函数调用须要是表达式最后一个。
Lua函数也支持可变参数:
function add (...)
local s = 0
for _, v in ipairs{...} do
s=s+ v
end
return s
end
print(add(3, 4, 10, 25, 12)) --> 54
复制代码
来简单总结一下,本文咱们介绍了Lua的基本语法,包括如何定义变量(包括全局变量和局部变量),8种基本数据类型,流程控制语句以及Lua中函数的一些特性。相信看完本文,你就能够写一些简单的Lua脚本了。
对Lua感兴趣的同窗能够自行前往Lua官网继续深造。