基础语法
-
函数用 local function 修饰,在 lua 中#可以求得表的长度,与 c 语言不同下表从 1 开始。
-
table.concat 可以获取数组的全部数值
-
lua 中变量不用定义,可以自动识别
-
Lua 变量有三种类型:全局变量、局部变量、表中的域。Lua 中的变量全是全局变量,哪怕是语句块或是函数里,除非用 local 显式声明为局部变量。
-
lua 中的 goto 使用
goto lable ::lable::
冒泡排序:
local function bubbleSort(arr)
for i = 1, #arr, 1 do
for j = 1, #arr -1 , 1 do
if arr[j] > arr[j+1] then
arr[j], arr[j+1] = arr[j+1], arr[j]
end
end
end
print(table.concat(arr, ","))
end
-- test
local list = {
53,36, -31,-81, -93,
}
bubbleSort(list)
字符匹配的正则表达
字符 | 匹配 |
---|---|
. | 任意字符 |
%a | 字母 |
%c | 控制字符 |
%d | 数字 |
%l | 小写字母 |
%p | 标点字符 |
%s | 空白符 |
%u | 大写字母 |
%w | 字母和数字 |
%x | 十六进制数字 |
%z | 代表 0 的字符 |
上面字符类的大写形式表示小写所代表的集合的补集 | 例如, '%A’非字母的字符 |
- [数个字符类]: 与任何[]中包含的字符类配对. 例如[%w_]与任何字母/数字, 或下划线符号(_)配对
- [^数个字符类]: 与任何不包含在[]中的字符类配对. 例如[^%s]与任何非空白字符配对
模式修饰符:
+ | 匹配前一字符 1 次或多次 |
* | 匹配前一字符 0 次或多次;最长匹配 |
- | 匹配前一字符 0 次或多次;最短匹配 |
? | 匹配前一字符 0 次或 1 次 |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
示例:
local ip_pattern = "inet addr:(%d+%p%d+%p%d+%p%d)"
这是一个正则表达式模式,用于匹配 IPv4 地址的字符串。
以下是对该模式的详细解释:
-
`^`:表示匹配字符串的开头。
-
`inet addr:`:匹配字符串 "inet addr:"。
-
`(%d+%p%d+%p%d+%p%d)`:这是一个捕获组,用于匹配 IPv4 地址的四个部分。其中:
- `%d+`:匹配一个或多个数字。
- `%p`:匹配一个或多个点。
- `%d+`:匹配一个或多个数字。
- `%p`:匹配一个或多个点。
整个模式的含义是:匹配以 "inet addr:" 开头,后面跟着一个或多个数字(表示 IPv4 地址的四个部分),每个部分由一个或多个数字和点组成。
迭代器
Lua 中 pairs 和 ipairs 都是 Lua 默认提供的迭代函数 。
-
相同之处:都是能遍历集合(表、数组)
-
不同之处:ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。不能返回 nil,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key。
-
pairs 能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。
-
例如:
for i,j in pairs/ipairs(arr) do
lua 的相关库
在 Lua 中,os 代表操作系统。它是一个库,提供了一些与操作系统相关的函数。例如获取系统时间、退出程序等。如:os.execute(“sleep 5”)
IO 库
io:open(filename [, mode])
这个函数用字符串 mode 指定的模式打开一个文件。 返回新的文件句柄。 当出错时,返回 nil 加错误消息。
mode 字符串可以是下列任意值:
“r”: 只读模式,这也是对已存在的文件的默认打开模式。
“w”: 可写模式,允许修改已经存在的文件和创建新文件(不可读)。
“a”: 追加模式,对于已存的文件允许追加新内容,但不允许修改原有内容,同时也可以创建新文件。
“r+”: 读写模式打开已存的在文件。
“w+”: 如果文件已存在则删除文件中数据;若文件不存在则新建文件。读写模式打开。
“a+”: 以可读的追加模式打开已存在文件,若文件不存在则新建文件。
read 参数:
- "*all" 读取整个文件
- "*line" 读取下一行
- "*number" 从串中转换出一个数值
- num 读取 num 个字符到串
注意: 可以 flush 和 lseek 与 c 库的标准文件操作类似
local my_string=io.popen("ifconfig br-lan | grep 'inet addr'")将打印的内容放在临时文件,并且返回一个文件描述符用于读写等操作
协程
- 在 Lua 中,可以使用 coroutine.create 创建协程,使用 coroutine.resume 来启动和恢复协程的执行。 协程可以通过 yield 来暂停自己的执行,并通过 resume 从暂停的位置继续执行。
- Lua 中没有线程,只有协程。协程只能运行一个
- 一个协程有以下四种状态,即挂起( spended )、运行( running) 、正常( normal )和死亡( dead )
- Lua 语言中协程相关的所有函数都被放在表 coroutine 中
- 协程看上去也就是一种复杂的调用函数的方式,协程的真正强大之处在于函数 yield ,该函数可以让一个运行中的协程挂起自己,然后在后续恢复运行。(不由内核管理,是程序管理的,更加轻量级)
元表
__add 元方法:
local a,b={1,2,3} , {4,5}
local mytable={
__add=function (t1,t2)
for k,v in pairs(t2) do
table.insert(t1,v)
end
return t1
end
}
setmetatable(a,mytable)
local c=a+b
for i,v in pairs(c) do
print(v)
end
注意:lua 仍然遵循 c 的一些特性
__index 元方法
函数形式:
local table={4,5,6}
local mytable={
__index=function (t,value)
return "table"
end
}
setmetatable(table,mytable) --当访问tab中一个不存在的索引时,会调用__index的函数
print(table[3])
print(table[4])
表形式:
local table={4,5,6}
local mytable={
__index={a=7,b=8,c=9}
}
setmetatable(table,mytable)
print(table[3])
print(table.a)
Lua 查找一个表元素时的规则,其实就是如下 3 个步骤:
1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
3.判断元表有没有__index 方法,如果 __index 方法为 nil,则返回 nil;如果__index 方法是一个表,则重复 1、2、3;如果 __index 方法是一个函数,则返回该函数的返回值。
__call 方法:
local table={1,2,3}
local mymetable={
__call=
function (tab,value)
print("call:",value)
return value
end
}
setmetatable(table,mymetable)
table(5)
当把元表作为函数来使用时,会调用__call 元方法
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于