zoukankan      html  css  js  c++  java
  • 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
    ")			-- fmt="rua",没有可变参数
    fwrite("%d%d
    ",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
    Lua")
    -- 输出以下字符串,与在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

  • 相关阅读:
    [HEOI2015]兔子与樱花
    [HNOI2015]亚瑟王
    [JSOI2011]分特产
    某考试 T3 sine
    [JSOI2015]最小表示
    51NOD 1258 序列求和 V4
    Codeforces 622F The Sum of the k-th Powers
    Loj #6261. 一个人的高三楼
    [HAOI????] 硬币购物
    bzoj4318 OSU!
  • 原文地址:https://www.cnblogs.com/JaxesZ/p/11217003.html
Copyright © 2011-2022 走看看