序
Lua语言本身以简单优雅为本,处理C不擅长的任务。
Lua本身完全遵循ANSI C而写成,只要有C编译器的地方,Lua便可发挥她的力量。
Lua是一种易扩展的语言,也是一种易整合语言。
特征:
1、可扩展性。易于C/C++、java、fortran、Smalltalk、Ada以及其他语言接口
2、简单。内容少但功能强大
3、高效性。
4、与平台无关。
全局变量
访问没有初始值的全局变量不会报错,只不过得到的结果是:nil。
print(b) ----> nil
b = 10
print(b) -----> 10
词法约定
标示符:字母或者下划线开头的字母,下划线,数字序列,最好不用下划线加大写字母的标示符。
保留字:and、break、do、else、if、function等等
Lua是大小写敏感的。
注释:单行注释--
多行注释 --[[ --]]
命令行方式
lua [optins] [script [args] ]
options
-e 直接将命令传入Lua
-l 加载一个文件
-i 进入交互模式
-PROMPT内置变量作为交互模式的提示符
类型和值
Lua是动态类型语言,变量不要类型定义。
8个基本类型:nil、boolean、number、string、userdata、function、thread和table
nil:特殊类型,全局变量没有赋值以前默认为nil,给全局变量赋nil可以删除该变量
boolean:false和true,在控制结构的条件中除了false和nil为假,其他值都为真,所以0和空串都为真
number:实数,lua中没有整数。
string:字符的序列,lua是8位字节,所有字符串可以包含任何数值的字符,包括嵌入0
string和其他对象一样,lua自动进行内存分配和释放,一个string可以包含一个字母,也可包含一本书
使用单引号或者双引号表示字符串
转译字符:
\a bell
\b ---后退
\f ---换页
\n ---换行
\r ---回车
\t ---制表
\v
\\ ---"\"
\" ---双引号
\' ---单引号
\[ ---左中括号
\] ---右中括号
[[ ... ]]表示字符串,字符串可以包含多行,可以嵌套且不会解释转义序列
Lua会自动在string和number之间自动进行类型转换,当一个字符串使用算术操作时,string会被转成数字
..在lua中是字符串连接符
当在一个数字后面写..时,必须加上空格,防止被解释错
字符串和数字可以自动转换,但是两者也有不同,当 10 == ‘10’比较永远是错的。
如果需要显示将string转化成数字,可以使用头number(),如果string不是正确的数字该函数将返回nil
function
函数是第一类值,意味可以将函数存放到变量中,可以作为函数的参数,也可以作为函数的返回值。
userdata可以将C数据存放在lua变量中,除了赋值和相等比较外,没有预定义的操作。
表达式
算术运算符
二元运算符:+、-、*、/、^(加减速除密)
一元运算符:-(负值)
这些运算符的操作数都是实数
关系运算符
<、>、<=、>=、==、~=
返回结果为false或者true;==和~=比较两个值,如果类型不同,Lua任务两者不同,nil只和自己相等
混合比较数字和字符串,lua会报错
逻辑运算符
and、or、not
逻辑运算符任务false和nil是假,其他都为真,0为真
and和or的运算结果不是true和false,而是与他们的两个操作数相关
a and b ---如果a为false,则返回a,否则返回b
a or b --如果a为false,则返回b,否则返回a
and 的优先级比or高
not的结果是返回false或者true
连接运算符
.. --两个点
如果操作数是数字,lua将数字转化成字符串。
优先级
从高到底的顺序
^
not、-(unary)
*、/
+、-
..
<、>、<=、>=、==、~=
and
or
表的构造
构造器是创建和初始化表的表达式
最简单的构造函数是{},用来创建一个空表。可以直接初始化为数组。
days = {"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"}
Lua将"Sunday"初始化days[1](第一个元素索引为1)
print(days[4]) --> Wednesday
构造函数可以使用任何表达式初始化:
tab = {sin(1), sin(2), sin(3), sin(4),sin(5),sin(6), sin(7), sin(8)}
如果想初始化一个表作为record使用可以这样:
a = {x=0, y=0} <--> a = {}; a.x=0; a.y=0 两种表示作用相同
不管用何种方式创建table,我们都可以向表中添加或者删除任何类型的域,构造函数仅仅影响表的初始化。
在同一个构造函数中可以混合列表风格和record风格进行初始化
polyline = {
color="blue", thickness=2, npoints=4,
{x=0, y=0},
{x=10, y=0},
{x=-10, y=1},
{x=0, y=1}
}
print(polyline[2].x) --> 10
基本语法
赋值语句
赋值是改变一个变量的值和改变表域的最基本的方法
Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。
a, b = 10, 2*x <--> a=10; b=2*x
遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,可以进行交换变量的
x, y = y, x -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[i]'
当变量个数和值的个数不一致
a. 变量个数>值的个数按变量个数补足nil
b. 变量个数<值的个数多余的值会被忽略
局部变量
使用local创建局部变量,与全局变量不同,局部变量只在声明的代码块中有效
代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。
控制语句
控制结构的条件可以是任何值。Lua任务false和nil是假,其他的都真
if语句三种模式
if conditions then
then-part
end;
if conditions then
then-part
else
then-part
end;
if conditions then
then-part
elseif conditions then
elseif-part
...
else
else-part
end;
while语句
while condition do
statements
end;
repeat-until语句
repeat
statements
until conditions;
for循环有两类
一类数值for循环
for var=exp1,exp2,exp3 do
loop-part
end
or将用exp3作为step从exp1(初始值)到exp2(终止值),执行loop-part。其中exp3可以省略,默认step=1
1. 三个表达式只会被计算一次,并且是在循环开始前。
2. 控制变量var是局部变量自动被声明,并且只在循环内有效.
3. 循环过程中不要改变控制变量的值,那样做的结果是不可预知的。如果要退出循环,使用break语句。
二类范型for循环
for i,v in ipairs(a) do print(v) end
范型for遍历迭代子函数返回的每一个值。
范型for和数值for有两点相同:
1. 控制变量是局部变量
2. 不要修改控制变量的值
break和return语句
break语句用来退出当前循环(for,repeat,while)。在循环外部不可以使用。
return用来从函数返回结果,当一个函数自然结束结尾会有一个默认的return。(这种函数类似pascal的过程)
函数
函数有两种用途:
1.完成指定的任务,这种情况下函数作为调用语句使用;
2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。
function func_name (arguments-list)
statements-list;
end;
调用函数的时候,如果参数列表为空,必须使用()表明是函数调用
当函数只有一个参数并且这个参数是字符串或者表构造的时候,()是可选
print "Hello World" <--> print("Hello World")
Lua也提供了面向对象方式调用函数的语法,比如o:foo(x)与o.foo(o, x)是等价的
Lua函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足。
function f(a, b) return a or b end
f(3) a=3, b=nil
f(3, 4) a=3, b=4
f(3, 4, 5) a=3, b=4 (5 is discarded)
返回多个结果值
Lua函数可以返回多个结果值,比如string.find,其返回匹配串“开始和结束的下标”
s, e = string.find("hello Lua users", "Lua")
print(s, e) --> 7 9
Lua函数中,在return后列出要返回的值得列表即可返回多值
Lua总是调整函数返回值的个数去适用调用环境,当作为一个语句调用函数时,所有返回值被忽略
第一,当作为表达式调用函数时
1. 当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去。
2. 其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)
一个return语句如果使用圆括号将返回值括起来也将导致返回一个值
函数多值返回的特殊函数unpack,接受一个数组作为输入参数,返回数组的所有元素
可变参数
Lua函数可以接受可变数目的参数
Lua将函数的参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数
printResult = ""
function print(...)
for i,v in ipairs(arg) do
printResult = printResult .. tostring(v) .. "\t"
end
printResult = printResult .. "\n"
end
命名参数
Lua的函数参数是和位置相关的,调用时实参会按顺序依次传给形参。有时候用名字指定参数是很有用的
Lua可以通过将所有的参数放在一个表中,把表作为函数的唯一参数来实现上面这段伪代码的功能。