目录
一、lua是什么?
二、lua的基本语法
1.运行lua脚本文件
2.注释
3.标示符
4.关键词
5.全局变量
三、数据类型
8个基本类型
1.nil(空)
2.boolean(布尔)
3.number(数字)
4.string(字符串)
5.table(表 )
6.function(函数)
7.thread(线程)
8.userdata(自定义类型)
四、变量
全局变量、局部变量与表中的域
赋值语句
五、循环与流程控制
循环
流程控制
六、函数
函数
多返回值
可变参数
本文章为笔者学习分享
学习网站:Lua 基本语法 | 菜鸟教程
一、lua是什么?
一种脚本式编程。将lus程序代码保存到一个以lua结尾的文件,并执行,该模式成为脚本式编程。
二、lua的基本语法
1.运行lua脚本文件
1.lua 脚本文件名
- 执行hello.lua脚本文件命令为
-
lua hello.lua
2.在代码开头添加一行如下代码:
#!/usr/local/bin/lua
该代码中,我们制定了lua的解释器/usr/local/bin diectory 加上#号标记编译器会忽略它。
然后在脚本中添加可执行权限,并执行:
./hello.lua
2.注释
单行注释
两个减号
--
多行注释
--[[
...
--]]
功能
提供交互式编程模式
lua -i
lua
3.标示符
lua标示符功能:用于定义一个变量、函数 获取其它用户定义的项
书写格式:以一个字母A到Z或a到z或下划线_卡头后加上0个或多个字母、下划线、数字(0到9)。
注意:
- 最好不要使用下划线+大写字母的标示符,因为lua的保留字也是这样的。
- lua不允许使用特殊字符,如@、$和%来定义标示符。
- lua是区分大小写的编程语言
4.关键词
保留关键字不能作为常量或变量或其他用户自定义标示符:
一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。
local:local关键字作为局部变量,不带local地关键字作为全局变量
一个lua文件中如果定义了全局变量,那么在别的文件中依然可以获取到这个全局变量的值。
in:不是函数也不是变量,它是流控制语法中的一部分。
5.全局变量
访问一个没有初始化的全局变量不会出错,只是得到的结果是nil
删除一个全局变量,只需要将变量赋值为nil,这样变量就好像从来没被使用过一样。
三、数据类型
lua是动态类型语言,变量不需要类型定义,只需要为变量赋值。
8个基本类型
数据类型 | 描述 |
nil | 表示一个无效值(条件表达式中相当于false) |
boolean | 包含两个值:false和true |
number | 表示双精度类型的实浮点数 |
string | 字符串由一对双引号或单引号来表示 |
function | 由C或者lua编写的函数 |
userdata | 存储在变量中的C数据结构 |
thread | 表示执行的独立路线,用于执行协同程序 |
table | lua中的table表其实是一个“关联数组”,数组的索引可以是数字、字符串或表类型。在lua里,table的创建是通过“构造表达式“来完成,最简单的构造表达式是{},用来创建一个空表。 |
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
print(type(type(X))) -- string
1.nil(空)
含义:表示一种没有任何有效值,它只有一个值 -- nil,例如打印一个没有赋值的变量,便会输出一个 nil 值。
nil作比较时应该加上双引号”
type(x)=="nil" --返回是“nil”字符串,是一个string类型
2.boolean(布尔)
boolean类型只有两个值:ture和false
lua把false和nil看作是false,其他都是true,数字0也是true
type(true)=boolean
type(flase)=boolean
type(nil)=nil
3.number(数字)
lua默认只有一种number类型:double双精度类型
4.string(字符串)
字符串由一对双引号"或单引号'来表示
可以用2个方括号"[[]]"来表示一块字符串
在对一个数字字符串上进行算术操作时,lua会尝试将这个数字字符串转成一个数字
字符串的连接使用的是两个..
使用#来计算字符串的长度,放在字符串的前面,如:
5.table(表 )
创建格式:table的创建是通过“构造表达式”来完成,最简单的构造表达式是{},用来创建一个空表。
通过在表内添加一些数据来初始化表
table不会固定长度大小,有新数据添加时table长度会自动增长,没初始的table都是nil
local tb1={} --空表
local tbl2={"1","2","3"};--初始化创建表
使用:lua的表其实是一个"关联数组",数组的索引可以是数字或字符串。
local tb1={}
tb1["key"]="value"
key=10 --key=10
a[key]=22
a[key]=a[key]+11 --value=33
初始索引:默认从1开始,而不是0
6.function(函数)
在lua中,函数被看作是”第一类值(First-Class Value)“
函数可以存在变量里
function可以以匿名函数(anonymous function)的方式通过参数传递
function A(key,val)
function(key,val) --匿名函数
7.thread(线程)
lua内最主要的线程是协同程序(co-routine)。它跟线程差不多,拥有自己的独立栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和塔器大部分东西。
线程与协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
8.userdata(自定义类型)
userdata是一种用户自定义数据。用于表示一种由应用程序或C/C++语言库所创建的类型,可以将任意C/C++的任意数据类型的数据(通常是(struct和指针)存储在Lua变量中调用。
四、变量
全局变量、局部变量与表中的域
局部变量:使用local关键字定义的变量,未使用local进行显示声明的变量是局部变量。
局部变量的作用域:从声明处开始到所在语句块结束
应该尽可能的使用局部变量,有两个好处:
- 避免命名冲突
- 访问局部变量的速度比全局变量更快
赋值语句
1.可以多个赋值
格式:变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量
a,b=10,2*x --a=10;n=2*x
顺序:先计算右边所有的值,然后再执行赋值操作
a=0 --a=0
b=a+1; --(1)a+1=1,(2)b=1
变量个数和值的个数不一致,lua会以变量个数为基础采取以下策略:
- 变量个数>值个数,按变量个数补足nil
- <,多余的值会被忽略
a,b,c=0,1 --a=0,b=1,c=nil
a,b=0,1,2 --a=0,b=1
a,b,c=0 --a=0,b=nil,c=nil 这个易错!
多值赋值经常用来交换变量,或将函数调用返回给变量,如下代码。fun()返回的值会一次赋值给变量a、b
a,b=fun()
五、循环与流程控制
循环
lua语言提供了以下几种循环处理方式:
1.while
条件为true时,程序重复执行
2.for
重复执行指定语句,重复次数可以在for语句中控制
3.repeat..until
重复执行,直到指定的条件为真时为止
4.循环嵌套
可以在循环内嵌套一个或多个循环语句
循环控制语句:
1.break
退出当前循环或语句,并开始脚本执行紧接着的语句
2.goto
将程序控制点移动到一个标签处
流程控制
1.if
2.if...else
3.if嵌套
六、函数
函数
对语句和表达式进行抽象的主要方法。
lua函数主要有两种用途:
- 完成指定的任务,在这种情况下函数作为调用语句使用
- 计算并返回值,在这种情况下函数作为赋值语句的表达式使用
函数定义:
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
--[[解析:
optional_function_scope: 该参数是可选的指定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。
function_name: 指定函数名称。
argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。
function_body: 函数体,函数中需要执行的代码语句块。
result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。--]]
多返回值
lua函数可以返回多个结果值
return 后要列出返回的值的列表
return a,b; -- 多返回值,a,b
可变参数
Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 ... 表示函数有可变的参数
也可以通过 select("#",...) 来获取可变参数的数量
通常在遍历变长参数的时候只需要使用 {…},然而变长参数可能会包含一些 nil,那么就可以用 select 函数来访问变长参数了:select('#', …) 或者 select(n, …)
- select('#', …) 返回可变参数的长度。
- select(n, …) 用于返回从起点 n 开始到结束位置的所有参数列表。
调用 select 时,必须传入一个固定实参 selector(选择开关) 和一系列变长参数。如果 selector 为数字 n,那么 select 返回参数列表中从索引 n 开始到结束位置的所有参数列表,否则只能为字符串 #,这样 select 返回变长参数的总数。