Lua
Lua的一些知识...
Lua
Lua
注释(–)
1
2
3
4
5
6
-- 单行注释
--[[
多行注释
多行注释
--]]
数据类型
- nil:无效值(false)
1
2
3
4
5
--nil作比较时应加上“”
local a
if a=="nil"
then
end
- boolean:使用 or 或者and 、not进行计算,除false和nil都为true
- number:表示双精度类型的实浮点数
- string:字符串由一对双引号或单引号来表示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--也可以用 2 个方括号 "[[]]" 来表示"一块"字符串。
local string=[[
41341
aff4
42
asfasf
]]
--在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字:
local a='12'
local b="20"
print(a+b)--32
--string链接使用..
a,b="nihao","hellp"
print(a..b)--nihaohello
--使用 # 来计算字符串的长度
print(#a)--5
- userdata:表示任意存储在变量中的C数据结构
- function:函数
- thread:表示执行的独立线路,用于执行协同程序
- table:表,可以用来存储任意类型的数据。其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。
变量
- 使用前需声明,但不需要类型定义
- 默认值为nil
- 类型:
全局变量
局部变量:作用域为从声明位置开始到所在语句块结束。
表中的域
- 在函数中除非用local声明,否则都为全局变量
赋值
可以为多个变量同时赋值
1
2
3
4
5
6
local a,b=1,2
--[[
当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略
a. 变量个数 > 值的个数 按变量个数补足nil
b. 变量个数 < 值的个数 多余的值会被忽略
]]--
赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以可以这样进行交换变量的值:
1
2
local a,b=1,2
a,b=b,a--交换ab的值
索引
- lua中索引从1开始
1
2
3
4
t={}
i=0
a= t[i]
b=t.i -- 当索引为字符串类型时的一种简化写法
循环
循环类型
- while 循环
- for 循环
- repeat until
控制语句
- break
- goto
条件语句(if)
1
2
3
4
if(0)--注意lua中0为true
then--用来标志前面的条件判断结束
--执行语句
end
函数(function)
1
2
3
4
5
--不必声明返回类型
function function1()
--执行语句
return 2,20,20--Lua语言函数可以返回多个值,每个值以逗号隔开。
end
Lua 中我们可以将函数作为参数传递给函数
1
2
3
4
5
6
7
8
9
function function2(str)
print(str.."请说")
end
function function3(str,c)
c(str)
end
function3("nihao",function2)
Lua 函数可以接受可变数目的参数,在函数参数列表中使用三点 … 表示函数有可变的参数。
通过 select(“#”,…) 来获取可变参数的数量
select(n, …) 用于返回从起点 n 开始到结束位置的所有参数列表。
1
2
3
4
5
6
7
function function4(...)
local table_1={...}--将传入参数接受为一个table
--执行语句
num1=select("#",...)--通过 select("#",...) 来获取可变参数的数量
table2=select(2,...)--select(n, …) 用于返回从起点 n 开始到结束位置的所有参数列表。
end
几个固定参数加上可变参数,固定参数必须放在变长参数之前
1
2
3
function function5(a,b,...)
end
运算符
- ~= :不等于
- # :表示返回表或者字符串的长度
- .. :链接字符串
- \^ :乘幂
- \\ :整除
- 优先级
-(unary)表示负号
字符串操作
长度获取
使用 string.len函数或 utf8.len 函数,包含中文的一般用 utf8.len,string.len 函数用于计算只包含 ASCII 字符串的长度。
截取
string.sub(s, i [, j])
- s:要截取的字符串。
- i:截取开始位置。
- j:截取结束位置,默认为 -1,最后一个字符。
1
2
local a="41631531"
b=string.sub(a,-10)--截取后十个字符串
大小写转换
- string.upper(string1)
- string.lower(string1)
常用字符串方法
字符与整数互转
迭代器
1
2
3
4
5
6
7
8
local a={1313,11,123,13,14}
-- key 表示索引,value 表示当前索引位置上的值
for key,value in pairs(a)
do
print(key,value)
end
--注意for i, v in ipairs(t) do,遇见nil就停止迭代
执行过程
1
2
3
4
5
6
7
8
9
10
11
function Xunhuan(max,result)
result=result+1
if result<=max then
return result,result^result
end
end
for i,n in Xunhuan,5,0
do
print(i,n);
end
- 计算in后面的方法
- 将 返回值赋予i,n
- 将 i作为第二个参数传入in后面的方法
- 将返回值赋予i,n
- 。。。。。。。
- 直到返回nil
table
- 如果没有对象存储table的内存地址,则系统将会回收该table
常用table方法
1
2
3
4
5
6
7
8
9
fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
print("连接后的字符串 ",table.concat(fruits))
-- 指定连接字符
print("连接后的字符串 ",table.concat(fruits,", "))
-- 指定索引来连接 table
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))
当获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。
可以使用以下方法来代替:
1
2
3
4
5
6
7
function table_leng(t)
local leng=0
for k, v in pairs(t) do
leng=leng+1
end
return leng;
end
元表
类似给table加上拓展方法
| 场景 | 元方法 | 示例 |
|---|---|---|
| 两表相加 | __add | {1,2} + {3} |
| 访问不存在的键 | __index | t.x 但 x 不存在 |
| 给不存在的键赋值 | __newindex | t.x = 1 但 x 不存在 |
| 字符串拼接 | __concat | "a" .. t |
| 相等比较 | __eq | t1 == t2 |
| 小于比较 | __lt | t1 < t2 |
| 垃圾回收前回调 | __gc | 释放资源 |
| 把表当函数调用 | __call | t() |
本文由作者按照 CC BY 4.0 进行授权










