Lua学习笔记(三)
Lua函数
函数定义
-- []为可选部分
[local] function function_name(argument1,argument2)
-- do something
[return result] -- 可以返回多个值,每个值以逗号隔开
end
-- 函数名表示该函数的引用,与C/C++的函数指针类似
可变参数
-- 与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("rua\n") -- fmt="rua",没有可变参数
fwrite("%d%d\n",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++相同
逻辑运算符
-- 只有当值为nil或false才是假,其他都为真(0也为真)
and -- 类似于C/C++的&&,当为假时返回从左到右表达式第一个为假的值(nil或false),否则返回后者
or -- 类似于C/C++的||,当为真时返回从左到右表达式第一个为真的值(非nil和非false),否则返回后者
not -- 类似于C/C++的!
其他运算符
.. -- 用于连接两个字符串或非字符串,最终返回一个字符串,注意连接一个number时需要在number与..之间加一个空格
# -- 一元运算符,返回string或table的长度
运算符优先级
优先级 | 运算符 |
---|---|
1 | ^ |
2 | not、-(负号) |
3 | *、/ |
4 | +、-(减号) |
5 | .. |
6 | <、>、<=、>=、~=、== |
7 | and |
8 | or |
除了^
和..
以外,其他所有的二元运算符都是从左向右结合
Lua字符串
字符串表示方法
'a string' -- 单引号
"a string" -- 双引号
[[a string]] -- 双中括号
转义字符
与C/C++相同
字符串操作
--[[
作用:字符串全部转为大写字母
参数列表:
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语言类似
-- %q接受一个字符串并将其转化为可安全被Lua编译器读入的格式,以下写法输出等价
string.format("%q","the\nLua")
-- 输出以下字符串,与在Lua编辑器下编写换行的字符串等价
"the\
Lua"
注意:%x
与%X
,%e
与%E
是不同的输出,前者输出都为小写字母,后者输出统一为大写字母
string.format("%x",13) -- 输出d
string.format("%X",13) -- 输出D
string.format("%e",1000) -- 输出1.000000e+03
string.format("%E",1000) -- 输出1.000000E+03