lua 语言

基础语法

  • 函数用 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 参数:

  1. "*all" 读取整个文件
  2. "*line" 读取下一行
  3. "*number" 从串中转换出一个数值
  4. 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 方法是一个函数,则返回该函数的返回值。

image

__call 方法:

local table={1,2,3}

local mymetable={
    __call=
        function (tab,value)
            print("call:",value)
            return value
        end
}
setmetatable(table,mymetable)
table(5)

当把元表作为函数来使用时,会调用__call 元方法

  • Lua
    17 引用 • 17 回帖 • 1 关注

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...