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

匹配模式

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

posted @ 2019-07-20 10:58  Jaxes  阅读(365)  评论(0编辑  收藏  举报