lua

函数可变参数

Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 … 表示函数有可变的参数

1
2
3
4
5
6
7
8
9
function add(...)  
local s = 0
local arg = {...} --> arg 为一个表,局部变量
for i, v in ipairs(arg) do --> {...} 表示一个由所有变长参数构成的数组
s = s + v
end
return s
end
print(add(3,4,5,6,7)) --->25

字符串操作

链接两个字符串 str1..str2

1
2
print("www.runoob.".."com")
=> www.runoob.com

字符串替换 string.gsub

string.gsub(mainString,findString,replaceString,num)

在字符串中替换。mainString 为要操作的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:

1
2
string.gsub("aaaa","a","z",3);
=> zzza 3 (3为替换的次数)

截取字符串 string.sub

string.sub() 用于截取字符串,原型为:string.sub(s, i [, j]) 截取字符串s的从第i个字符到第j个字符之间的串,j默认为-1,最后一个

字符串查找 string.find

string.find (str, substr, [init, [end]]) 若存在,则返回2个值:匹配串开始索引和结束索引。若不存在,返回nil。

1
2
3
local a, b = string.find("Hello Lua user", "Lua", 1)
print(a, b)
=> 7 9

字符串匹对 string.match

string.match(str, pattern, init)

string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。
在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。

pattern没有指定captures,那么将返回整个匹配内容。capture是指pattern中用小括号括起来的内容比如print(string.match(“hello world”, “h(ell)o wor”)),这将打印ell,如果没有这个小括号呢,比如print(string.match(“hello world”, “hello”)),这将打印hello.这就是与“hello”整个相匹配的内容都返回了。

pattern 要了解lua的正则表达式

1
2
3
local str = "ACK(22,33,55)"
local res = string.match(str, "ACK%((.-)%)$") --> 22,33,55
local n1, n2, n3 = string.match(s, "(%d+),(%d+),(%d+),") --> 22 33 55

string.gmatch(str, pattern)

返回一个迭代器函数每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串

1
2
3
4
local str = "Hello Lua user"
local fun = string.gmatch(str, "%a+")
print(fun(),fun(),fun())
=> Hello Lua user

字符串反转 string.reverse(arg)

字符串长度 string.len(arg)

格式化字符串 string.format

生成具有特定格式的字符串,第一个参数为格式化串:由指示符和控制格式的字符组成。参数如同C语言的print语法

1
2
local y = '2019'; local m = '12'; local d = '15';
print(string.format("%2d/%2d/%2d",m, d, y)) => 12/15/2019

字符串大小写转换 string.upper string.lower

字符串拷贝 string.rep(string, n)

1
string.rep("abcd",2)   =>  abcdabcd	注意:不改变字符串本身

Lua 数组

定义 array = {item1, item2}

数组的遍历

1
2
3
4
5
for key,value in ipairs(array) 
do
print(key, value)
end
==> key 为1,2 value为值, 数组for...in 循环第一个参数也是key

Lua 表

定义 mytable = {}

table 方法

插入 table.insert (table, [pos,] value)

在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾

移除 table.remove (table [, pos])

返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起

排序 table.sort (table [, comp])

对给定的table进行升序排序。

长度 #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 连接成字符串 table.concat (table [, sep [, start [, end]]])

concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开

1
2
3
local arr = {"as", "bs", "cs", "ds"}
print(table.concat(arr)) => asbscsds
print(table.concat(arr, " ", 2, 3)) => bs cs

Lua 迭代器

迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。 Lua 默认提供的迭代函数 ipairs

在 Lua 中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。

泛型 for 迭代器

泛型 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。

泛型 for 迭代器提供了集合的 key/value 对,语法格式如下:

1
2
3
4
5
6
array = {"Google", "Runoob"}
for key,value in ipairs(array)
do
print(key, value)
end
==> key 为1,2 value为值, 数组for...in 循环第一个参数也是key

无状态的迭代器

无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。

每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。

这种无状态迭代器的典型的简单的例子是 ipairs,它遍历数组的每一个元素。

Lua的模块和包 module

创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}

-- 定义一个常量
module.constant = "这是一个常量"

-- 定义一个函数
function module.func1()
io.write("这是一个公有函数!\n")
end

local function func2()
print("这是一个私有函数!")
end

function module.func3()
func2()
end

return module

加载模块

Lua提供了一个名为require的函数用来加载模块。要加载一个模块,只需要简单地调用就可以了。

1
require("<模块名>")   如require("module") 要求路径时如 require("/module/module")

Lua的正则表达式

​ 网页跳转到: Lua的正则表达式 查看详细

正则表达式