Lua函数

函数定义

1
2
3
4
5
6

[local] function (argument1,argument2)
-- do something
[return result] -- 可以返回多个值,每个值以逗号隔开
end
-- 函数名表示该函数的引用,与C/C++的函数指针类似

可变参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
-- 与C语言类似,在函数参数列表中使用三点...表示函数有可变的参数
function add(...)
local s=0
for i,v in ipairs{...} do -- 注意这里是{},{...}表示一个由所有变长参数构成的table(这里实质是一个数组)
s=s+v
end
return s
end
print(add(3,4,5,6,7)) -- 输出:25

-- 可变参数也可以赋值给一个变量
function average(...)
result=0
local arg={...} -- arg为一个table,局部变量
for i,v in ipairs(arg) do
result=result+v
end
print("总共传入 " .. #arg .. " 个数") -- #也可以用于计算table中的元素个数
return result/#arg
end
print("平均值为",average(10,5,3,4,5,6))

-- 也可以通过select("#",...)来获取可变参数的数量
function average(...)
result = 0
local arg={...}
for i,v in ipairs(arg) do
result = result + v
end
print("总共传入 " .. select("#",...) .. " 个数") -- 等价于#arg
return result/select("#",...)
end
print("平均值为",average(10,5,3,4,5,6))

-- 也可能同时需要固定参数和可变参数
function fwrite(fmt,...)
return io.write(string.format(fmt,...))
end

fwrite("ruan") -- fmt="rua",没有可变参数
fwrite("%d%dn",1,2) -- fmt="%d%d",可变参数为1和2

-- select函数
do
function foo(...)
for i = 1, select('#', ...) do -- 获取参数总数
local arg = select(i, ...); -- 读取第i个可变实参
print("arg", arg);
end
end
foo(1, 2, 3, 4);
end

Lua运算符

Lua运算符类型

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 其他运算符

算术运算符

除了^用于计算幂,其他加、减、乘、除、取余、取反等都与C/C++相同

关系运算符

除了不等于号~=,其他等于、大于、小于、大于等于、小于等于等都与C/C++相同

逻辑运算符

1
2
3
4
-- 只有当值为nil或false才是假,其他都为真(0也为真)
and -- 类似于C/C++的&&,当为假时返回从左到右表达式第一个为假的值(nil或false),否则返回后者
or -- 类似于C/C++的||,当为真时返回从左到右表达式第一个为真的值(非nil和非false),否则返回后者
not -- 类似于C/C++的!

其他运算符

1
2
..		-- 用于连接两个字符串或非字符串,最终返回一个字符串,注意连接一个number时需要在number与..之间加一个空格
# -- 一元运算符,返回string或table的长度

运算符优先级

优先级 运算符
1 ^
2 not、-(负号)
3 *、/
4 +、-(减号)
5 ..
6 <、>、<=、>=、~=、==
7 and
8 or

除了^..以外,其他所有的二元运算符都是从左向右结合

Lua字符串

字符串表示方法

1
2
3
'a string'		-- 单引号
"a string" -- 双引号
[[a string]] -- 双中括号

转义字符

与C/C++相同

字符串操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
--[[
作用:字符串全部转为大写字母
参数列表:
argument:原字符串
返回值:转换为大写后的字符串
]]
string.upper(argument)

--[[
作用:字符串全部转为小写字母
参数列表:
argument:原字符串
返回值:转换为小写后的字符串
]]
string.lower(argument)

--[[
作用:在字符串中替换,相当于其他语言的string.replace
参数列表:
mainString:要替换的字符串
findString:被替换的字符串
replaceString:要替换成的字符串
num:替换次数(忽略表示全部替换)
返回值:替换后的字符串和实际替换次数
]]
string.gsub(mainString,findString,replaceString,num)

--[[
作用:查找子串
参数列表:
str:目标字符串
substr:子串
init:查找的起始索引
end:查找的末尾索引
返回值:子串始末字符位置索引,不存在返回nil
]]
string.find(str,substr,[init,[end]])

--[[
作用:字符串反转
参数列表:
arg:原字符串
返回值:反转后的字符串
]]
string.reverse(arg)

--[[
作用:返回一个类似C语言的printf的格式化字符串
参数列表:
...:可变参数列表
返回值:格式化字符串
]]
string.format(...)
-- 示例
string.format("the value is:%d",4) -- 返回:the value is:4

--[[
作用:将整型数字转成字符并连接
参数列表:
arg:ASCCI码组成的参数列表
返回值:一个由ASCCI码对应的字符连接成的字符串
]]
string.char(arg)

--[[
作用:转换字符为整数值
参数列表:
arg:字符串
int:指定字符串某索引位置的字符,默认为第一个字符
返回值:字符对应的ASCCI码整数值
]]
string.byte(arg,[int])

--[[
作用:计算字符串长度
参数列表:
arg:字符串
返回值:字符串长度
]]
string.len(arg)

--[[
作用:拷贝并连接n个字符串
参数列表:
string:字符串
n:拷贝次数
返回值:字符串string的n个拷贝连接成的字符串
]]
string.rep(string,n)

-- 连接字符串
..

--[[
作用:查找下一个匹配的子串
参数列表:
str:字符串
pattern:正则匹配表达式
返回值:一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串,如果没有找到子串,返回nil
]]
string.gmatch(str,pattern)

--[[
作用:寻找原字符串str中的第一个配对
参数列表:
str:字符串
pattern:正则匹配表达式
init:指定搜寻过程的起点,默认为1
返回值:配对表达式中的所有捕获结果,即匹配到的字符串
]]
string.match(str,pattern,init)

字符串格式化

除了%q,其余与C语言类似

1
2
3
4
5
-- %q接受一个字符串并将其转化为可安全被Lua编译器读入的格式,以下写法输出等价
string.format("%q","thenLua")
-- 输出以下字符串,与在Lua编辑器下编写换行的字符串等价
"the
Lua"

注意:%x%X%e%E是不同的输出,前者输出都为小写字母,后者输出统一为大写字母

1
2
3
4
string.format("%x",13)		-- 输出d
string.format("%X",13) -- 输出D
string.format("%e",1000) -- 输出1.000000e+03
string.format("%E",1000) -- 输出1.000000E+03

匹配模式

https://www.runoob.com/lua/lua-strings.html