Lua学习笔记一
PS:由于公司项目中用到Lua,所以准备学习一下,这里做下学习笔记。
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
基本语法
交互式编程
lua -i 进入交互式编程
脚本式编程
新建一个hello.lua文件,将lua代码写在hello.lua中
print("Hello world")
执行:
lua hello.lua
结果:
Hello rorld
也可以将代码改为如下形式:
1 | #!/usr/local/bin/lua |
执行:
./hello.lua
结果和上面一样。
这种模式称为脚本式编程。
注释
单行注释:
--
多行注释:
1 |
|
标识符
以字母或者下划线_开头,后面加上0个或多个字母,下划线,数字。(标识符区分大小写)
关键字
and | break | do | else |
---|---|---|---|
elseif | end | false | for |
function | if | in | local |
nil | not | or | repeat |
return | then | true | until |
while |
Lua变量
- 全局变量 -默认申明的都是全局变量,除非申明为局部变量
- 局部变量-指定为local时
- 表字段-特殊变量,可以保存除了nil之外的任何内容,包括函数
变量定义
格式:
type variable_list
示例:
1 | local i,j |
变量初始化:
type variable_list = value_list
示例:
1 | local a,b = 10,20 |
结果:
1 | a: 10 |
Lua数据类型
Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
Lua中的值类型有八种:
数据类型 | 描述 |
---|---|
nil | 无效值,没有被赋值,条件表达式中为false |
boolean | false和true |
number | 双精度类型的实浮点数 |
string | 字符串,单引号或双引号内 |
function | 表示C或者Lua编写的函数 |
userdata | 表示C语言数据结构 |
thread | 表示独立的执行线程,它用于实现协同程序 |
table | 表示普通数组,符号表,集合,记录,图形,树等,并实现关联数组。 它可以保存任何值(除了nil ) |
1 | print(type("Hello world")) --string |
运行结果:
1 | string |
nil
nil 表示无效值,如一个没有被赋值的变量
1 | print(type(a)) |
对于全局变量和 table,nil 还有一个”删除”作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉
1 | tab = {key1 = "val1",key2 = "val2","val3"} |
结果:
1 | 1---val3 |
type(type(x)) 结果是string
type(x) == nil 结果是false
type(x) == “nil” 结果是true
boolean
boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是”假”,其他的都为”真”
number
Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义)
string
字符串由一对双引号或单引号来表示
1 | string1 = "hello world" |
也可以用[[]]表示一块字符串
1 | html = [[ |
在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字:
1 | print("1" + 1) |
结果:
1 | 2.0 |
“Hello” + 1 执行报错
字符串的拼接用 ..
1 | print("a" .. "b") |
使用#来计算字符串长度
print(#"hello world")
结果为:11
table(数组,字典 )
table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表:
pairs 遍历所有元素 字典无序
ipairs 只能遍历数组,不能遍历字典类型,只能遍历没有key的元素
1 | local table1 = {} --方式一 |
Lua的table是一个”关联数组”,数组的索引可以是数字或者是字符串
1 | a = {} |
结果:
1 | 1:3 |
Lua 数组默认索引从1开始:
1 | local table = {"a","b","c"} |
结果:
1 | key 1 |
table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil
1 | local table = {} |
结果:
1 | value |
因为key为a的元素没有初始化,所以为nil
table 的长度和字符串长度一样,用#来获取:
print(#table)
function
Lua中,函数是被看作是”第一类值(First-Class Value)”,函数可以存在变量里:
1 | function test(a) |
结果:
1 | 1 |
function 可以以匿名函数的方式通过参数传递:
1 | function testFun(tab,fun) |
结果:
1 | k2=v2 |
thread
lua中,最主要的线程是协同程序
userdata
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
运算符
算术运算符
关系运算符
逻辑运算符
其他运算符
算术运算符
1 | + 加法运算 |
关系运算符
1 | == |
逻辑运算符
1 | and |
其他运算符
1 | .. 字符串拼接 |