上一章我们学习了lua的数据类型,以及语法的定义,今天我们学习lua的数据类型操作,其实就是lua库一些api的操作,遇到对数据类型处理时,可以根据lua库提供的操作来实现。
一.字符串操作
1.字符串的三种表现形式
string1 = "字符串表现形式1" string2 = '字符串表现形式2' string3 =[[字符串表现形式3]] print(string1) print(string2) print(string3)
2.字符串操作
s1 = "abc"; s2 = "ABC"; s3 = "aaadc"; s4 = "hello lua"; -- 转换成大写 print("字符串的大写转换:",string.upper(s1)); --- ABC -- 转换成小写 print("字符串的小写转换:",string.lower(s2)); --- abc -- 字符串的替换 print("字符串的替换:",string.gsub(s3,"a","b")); --- bbbdc -- 搜索:在一个字符串中搜索指定的内容(第三个参数为要查找的字符串的索引位置从哪里开始) print("查找字符串中的内容:",string.find(s4,"ua",1)); --- 8 9 --print("查找字符串中的内容:",string.find(s4,"lua",8)); --- nil -- 反转: print("字符串的反转:",string.reverse(s4)); --- aul olleh -- 字符串的格式化: print(string.format("the value is:%d ",4)); --- the value is:4 -- 将整型数字转换成字符,并连在一起 print(string.char(97,98,99,100)) --- abcd -- 转换字符为整数值 --对于1个字符串默认转化第1个,当有第2个参数指定时,按指定的转化 print(string.byte("ABCD")) --- 65 print(string.byte("ABCD",4)) --- 68 -- 字符串的长度 print("字符串的长度是:",string.len("abcd")) --- 4 -- 复制字符串 -- 根据第2个参数,复制固定次数的字符串 print("复制字符串:",string.rep("abcd",2)) --- abcdabcd -- 连接2个字符串 print("xiaoi".." robot") --- xiaoi robot -- 返回迭代器函数 -- 对1个字符串的的字符,按第2个参数进行匹配,如果匹配成功返回数值 -- 如果没有匹配成功,则返回nil -- 这里的%a 是与任何字母配对,"+" 号表示将匹配的一个字符串中的字符连接起来 for word in string.gmatch("Hello Lua user", "%a+") do print(word) end -- match 匹配字符串中第1个配对的字符串,参数init可选 -- 指定搜索过程的的起点,默认为1 -- 注意,这里只匹配第1个符合的字符串 print(string.match("I have 2 questions for you","%d %a+",1));
3.数组操作
注意数组与表的不同,数组中存相同的元素,而表是可以根据key存不同的值,数组就是普通的数组,而表有点类似于java中的map,但它又不是map
-- 1.一维数组 print("======== 数组 =======") array ={ "lua","java"} for i = 1, 2 do print(array[i]) end
4.迭代器
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。
在 Lua 中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。
-- 1.泛型迭代器 for array = { "java","lua"} for key, val in pairs(array) do print(key,"=",val); end -- for执行过程: -- 首先,初始化in 后面的表达式的值,表达式返回for需要的三个值: -- 迭代函数 状态常量 控制常量 -- (个人理解:控制常量:类似于java中iterator中的hasNext,控制调用的次数) -- (个人理解:状态常量:类似于java中iterator中的next) -- 第2步:控制常量 和状态常量作为参数调用迭代函数 -- 第3步:将迭代函数的返回值返回给变量列表(key,val) -- 第4步:如果返回的第1个值为nil循环结束,否则招行循环体 -- 第5步:回到第二步再次进行迭代 -- 在Lua中我们常常使用函数来描述迭代器每次调用函数返回集合的下一个元素 -- lua 中的迭代器包含2种类型: -- 无状态迭代器 (ipairs 函数) -- 多状态迭代器 -- 无状态迭代器 function square(iteratorNum,currentNum) if currentNum < iteratorNum then currentNum = currentNum + 1 return currentNum,currentNum * currentNum; end end for key , doubleKey in square,3,0 do print(key,doubleKey) end -- 多状态迭代器 -- 很多情况下,迭代器需要保存多个状态信息而不是简单的状态常量和控制变量 -- 最简单的方法是使用闭包,还有一种方法就是将所有的状态信息封装到 table 内 -- 将 table 作为迭代器的状态常量,因为这种情况下可以将所有的信息存放在 -- table 内,所以迭代函数通常不需要第二个参数 array = { "java","lua","scala"} function elementIterator(tab) local index = 0; local count = #tab; -- 闭包函数 return function() index = index +1; if index <= count then -- 返回迭代器的当前元素 return tab[index] end end end for element in elementIterator(array) do print(element) end -- 多状态迭代器其实就是自己定义的函数来遍历元素,对遍历中的元素状态是可控的