Lua语言入门01
参考文档:博客园:Lua ===> Lua 十分钟基础入门上手
一、Lua简介
- Lua的目标是成为一个很容易嵌入到其他语言中使用的语言;
- 很多程序员使用Lua作为自己的嵌入式脚本语言,实现可配置性,可扩展性;
- 轻量级语言,体积小速度启动快,只包含一个精简的核心和基本的库;
- Lua很容易的被扩展,由宿主语言提供网络通讯,图形界面等功能;
- Lua是一个动态弱类型语言,支持增量式垃圾收集策略。有内建的,与操作系统无关的协作式多线程(coroutine)支持;
- 我们可以用其特有的表结构(Lua唯一提供的复杂数据结构)轻易模拟继承、命名空间、类等概念的实现;
- Lua原生支援的数据类型非常之少,它只提供了数字(缺省是双精度浮点数,可配置)、布尔量、字符串、表、子程序、协程(coroutine)以及用户自定义数据这几种。但是其处理表和字符串的效率非常之高,加上元表的支援,我们可以高效的模拟出需要的复杂数据类型(比如集合、数组等)。
二、语法基础
在Lua中,一切都是变量,除了关键字!
注释
1
2
3
4
5
6--单行注释用两个减号标记
--[[
多行注释:
用减号和两个方括号
]]语句分隔
语句之间可以用半角分号
;
表示结束,也可以用空白分隔!如:1
print("Hallo world!")
语句块
语句块在多数语言中是用
{
和}
括起来的,在Lua中,它是用do
和end
括起来的。比如:1
do print("Hello") end
你可以在 函数中和语句块中定义局部变量。
条件控制语句
可以用
break
终止循环;循环条件不用括号括起来;
if else
循环1
2
3
4
5
6
7
8
9
10
11if (条件) then
...
end
if 条件 then
...
else if 条件 then
...
else ...
...
endwhile
循环1
2
3while 条件 do
...
endrepeat
循环1
2
3repeat
...
until 条件for
循环1
2
3
4
5
6
7for 变量=初值,终点值,步进值 do
...
end
for 变量1, 变量2, ..., 变量n, in表或枚举函数 do
...
end循环体内的变量也是局部变量;
步进值若省略则自动使用默认值
1
;
赋值语句
定义一个变量的方法就是赋值,
=
操作符就是用来赋值的,在Lua中赋值语句更方便:1
2
3a,b,c = 1,2,3 --相当于a=1 b=2 c=3
a,b = b,a --交换ab的值当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
a. 变量个数 > 值的个数 –按变量个数补足nil
b. 变量个数 < 值的个数 –多余的值会被忽略
如:
1
2
3
4
5
6
7a, b, c = 1, 2
print(a, b, c)
>1 2 nil
a, b = 4, 5, 6, 7
print(a,b)
>4 5Lua语言的函数返回值可以不止一个,因此可以用函数给多个变量赋值:
1
a, b, c = function01() --function01()函数返回三个值依次赋给abc
数值运算符
和C语言一样,支持
+
,-
,*
,/
,此外还有整除运算符//
(Lua版本>=5.3)。在Lua中,
/
运算是会包含小数部分的,//
才能整除。但Lua还多了一个
^
,这表示指数乘方运算。比如2^3
结果为8
,2^4
结果为16
。连接两个字符串,可以用”..”运处符。如:
1
"This a " .. "string." --结果为:"This a string."
比较运算符
<
小于,>
大于,<=
不大于,>=
不小于,==
相等,~=
不相等,这些操作符的运算结果只有true
或false
。对于
Table
、Function
和Userdata
类型的数据,只能进行==
和~=
,二者都判断引用的是否是同一份数据,如:1
2
3a={1,2}; b=a; c={1,2}
print(a==b, a~=b) --true, false
print(a==c, a~=c) --false, true逻辑运算:
and
、or
、not
注:在Lua中,只有false和nil才计算为false,其它任何数据都计算为true,0和空串也是true!
a and b
:如果a
为false
,则返回a
,否则返回b
;a or b
:如果a
为true
,则返回a
,否则返回b
;not
取反,相当于!
,!条件
,条件为真返回假,条件为假返回真。
1
2
3
4
5
6
7
8
9print(4 and 5) --5
print(nil and 13) --nil
print(false and nil) --false
print(4 or 5) --4
print(false or 12) --12
--[[
我们可以模拟C语言中的语句:x = a? b : c,在Lua中,可以写成:x = a and b or c。
最有用的语句是: x = x or v,它相当于:if not x then x = v end 。
]]运算符优先级
运算符优先级,从高到低顺序如下:
^
not
、-
(一元运算)*
、/
+
、-
..
<
、>
、<=
、>=
、~=
、==
and
or
关键字
关键字是不能做为变量的。Lua的关键字不多,就以下几个:
1
and break do else elseif end false for function if in local nil not or repeat return then true until while
三、数据类型
- 在Lua中,不管你在什么地方使用变量,都不需要声明,并且所有的这些变量总是全局变量,除非,你在变量名前加上
local
。 - 变量名字大小写相关,如Abb和abb是两个不同的变量。
- 可以用
type()
函数来检查变量是什么类型,该函数返回的是类型名称的字符串。
1、Nil
类型
nil
类型表示一种没有任何有效值,它只有一个值nil
,如果打印一个没有赋值的变量,便会输出一个nil
值。
换句话说,当且仅当一个变量不等于nil时,这个变量即存在。
对于全局变量和table
,nil
还有一个“删除作用”,给全局变量或者table
表里的变量赋一个nil
值,等同于把它们删掉。
1 | var1 = nil |
2、Boolean
类型
布尔值。在Lua中,只有false
和nil
才计算为false
,其它任何数据都计算为true
,0
和空串也是true
!
1 | var2 = true |
3、Number
类型
数值型,在Lua里,数值相当于C语言的double
,且没有整数类型。
一般情况下,只要数值不是很大(比如不超过100,000,000,000,000),是不会产生舍入误差的。
1 | var3, var4 = 10, 3.14 |
5、String
类型
字符串。字符串在Lua中有几种方法来表示,可以用双引号或单引号来括起一个字符串,如:
1 | 'This is a string.' |
如果要保持原来的空白和换行,则需要用两个方括号括起来:
1 | javacode = [[ |
使用 # 来计算字符串的长度,放在字符串前面,如下实例:
1 | len = "www.runoob.com" |
也可使用string.len()
和utf8.len()
函数获取字符串的长度,返回值为Number类型的数字。前者只用于计算包含ASCII字符串的长度,后者可以计算包含中文的字符串。如:
1 | local myStr01 = "昨夜闲潭梦落fa" |
类型转换:
Lua会根据上下文在合理合法的情况下隐式进行数字和字符之间的转换。
另外,也可以使用tonumber()
函数和tostring()
函数手动控制字符与数字的转换:
1 | a = 666 b = '23163' |
6、Table
类型
后面详细说。
table
是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是nil
。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
Lua也是通过table
来解决模块(module)、包(package)和对象(Object)的。 例如string.format
表示使用format
来索引table string
。
7、Function
类型
函数类型,函数也是一种类型,也就是说,所有的函数,它本身就是一个变量。
在Lua中,函数是被看作是”第一类值(First-Class Value)”,函数可以存在变量里。
8、Userdata
类型
userdata
是一种用户自定义数据,用于表示一种由应用程序或C/C++语言库所创建的类型,可以将任意C/C++的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
9、Thread
类型
线程类型,在Lua中没有真正的线程。Lua中可以将一个函数分成几部分运行。
在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
四、函数
1、函数的定义
上文提到,Lua中函数也是一种变量,所以定义函数要用关键字function
:
1 | function suma_b() |
2、可变参数
Lua函数可以接受可变数目的参数,和C语言类似,在函数参数列表中使用三点...
表示函数有可变的参数。
1 | function func01(...) |