Lua 菜鸟教程链接:https://www.runoob.com/lua/lua-tutorial.html
目录
字符串
表示
转义字符
操作
数组
一维数组(默认从1开始)
多维数组
迭代器
泛型for迭代器
无状态的迭代器
多状态的迭代器
table(不固定大小)
操作
table.concat (table [, 分隔符 [, 开始索引[, 结束索引]]])
table.insert (table, [pos,] value)和table.remove (table [, pos])
table.sort (table [, comp])
table.maxn (table) Lua5.2之后该方法已经不存在了
-- 双引号
string1 = "Lua"
print("\"字符串 1 是\"",string1)
-- 单引号
string2 = 'runoob.com'
print("字符串 2 是",string2)
-- [[和]]之间
string3 = [["Lua 教程"]]
print("字符串 3 是",string3)
"字符串 1 是" Lua 字符串 2 是 runoob.com 字符串 3 是 "Lua 教程"
转义字符 |
意义 |
ASCII码值(十进制) |
\a |
响铃(BEL) |
007 |
\b |
退格(BS) ,将当前位置移到前一列 |
008 |
\f |
换页(FF),将当前位置移到下页开头 |
012 |
\n |
换行(LF) ,将当前位置移到下一行开头 |
010 |
\r |
回车(CR) ,将当前位置移到本行开头 |
013 |
\t |
水平制表(HT) (跳到下一个TAB位置) |
009 |
\v |
垂直制表(VT) |
011 |
\\ |
代表一个反斜线字符''\' |
092 |
\' |
代表一个单引号(撇号)字符 |
039 |
\" |
代表一个双引号字符 |
034 |
\0 |
空字符(NULL) |
000 |
\ddd |
1到3位八进制数所代表的任意字符 |
三位八进制 |
\xhh |
1到2位十六进制所代表的任意字符 |
二位十六进制 |
方法 | 用途 |
string.upper(arg) | 字符串全部转为大写字母 |
string.lower(arg) | 字符串全部转为小写字母 |
string.gsub(mainString,findString,replaceString,num) | 在字符串中替换。 >string.gsub("aaaa","a","z",3); zzza 3 |
string.find (mainString, findString, [init, [end]]) | 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。 > string.find("Hello Lua user", "Lua", 1) 7 9 |
string.reverse(arg) | 字符串反转 |
string.format(...) | 返回一个类似printf的格式化字符串 >string.format("the value is:%d",4) the value is:4 |
string.char(arg)
string.byte(arg[,int]) |
char 将整型数字转成字符并连接 > string.char(97,98,99,100) abcd
byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。 > string.byte("ABCD",4) 68 > string.byte("ABCD") 65 |
string.len(arg) | 字符串长度 |
string.rep(string, n) | 返回字符串的n个拷贝 |
string.gmatch(str, pattern) | 回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。 > for word in string.gmatch("Hello Lua user", "%a+") do print(word) end Hello Lua user |
string.match(str, pattern, init) | 只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。 > = string.match("I have 2 questions for you.", "%d+ %a+") 2 questions
|
字符串格式化 string.format(...)
-- 基本字符串格式化
print(string.format("基本格式化 %s %s",string1,string2))
-- 日期格式化
date = 2; month = 1; year = 2014
print(string.format("日期格式化 %02d/%02d/%03d", date, month, year))
-- 十进制格式化
print(string.format("%.4f",1/3))
-- 接受一个数字, 并将其转化为ASCII码表中对应的字符
string.format("%c", 83) -- 输出S
-- 接受一个数字并将其转化为有符号的整数格式
string.format("%+d", 17.0) -- 输出+17
string.format("%05d", 17) -- 输出00017
-- 接受一个数字并转换为无符号整数
string.format("%u", 3.14) -- 输出3
-- 接受一个数字并转换为八进制
string.format("%o", 17) -- 输出21
-- 接受一个数字并将其转化为十六进制数格式, 使用小/大写字母
string.format("%x", 13) -- 输出d
string.format("%X", 13) -- 输出D
-- 接受一个数字并将其转化为科学记数法格式, 使用小写字母e/E
string.format("%e", 1000) -- 输出1.000000e+03
string.format("%E", 1000) -- 输出1.000000E+03
-- 接受一个数字并将其转化为浮点数格式
string.format("%6.3f", 13) -- 输出13.000
-- 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
string.format("%q", "One\nTwo") -- 输出"One\
-- Two"
-- 接受一个字符串并按照给定的参数格式化该字符串
string.format("%s", "monkey") -- 输出monkey
string.format("%10s", "monkey") -- 输出 monkey
string.format("%5.3s", "monkey") -- 输出 mon
%号后添加参数. 参数将以如下的顺序读入:
array = {"Lua", "Tutorial"}
for i= 0, 2 do
print(array[i])
end
nil Lua Tutorial
-- 初始化数组
array = {}
for i=1,3 do
array[i] = {}
for j=1,3 do
array[i][j] = i*j
end
end
-- 访问数组
for i=1,3 do
for j=1,3 do
print(array[i][j])
end
end
-- 初始化数组
array = {}
maxRows = 3
maxColumns = 3
for row=1,maxRows do
for col=1,maxColumns do
array[row*maxColumns +col] = row*col
end
end
-- 访问数组
for row=1,maxRows do
for col=1,maxColumns do
print(array[row*maxColumns +col])
end
end
array = {"Google", "Runoob"}
for key,value in ipairs(array)
do
print(key, value)
end
无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。
每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。
这种无状态迭代器的典型的简单的例子是 ipairs,它遍历数组的每一个元素。
function iter (a, i)
i = i + 1
local v = a[i]
if v then
return i, v
end
end
function ipairs (a)
return iter, a, 0
end
很多情况下,迭代器需要保存多个状态信息而不是简单的状态常量和控制变量,最简单的方法是使用闭包,还有一种方法就是将所有的状态信息封装到 table 内,将 table 作为迭代器的状态常量,因为这种情况下可以将所有的信息存放在 table 内,所以迭代函数通常不需要第二个参数。
array = {"Google", "Runoob"}
function elementIterator (collection)
local index = 0
local count = #collection
-- 闭包函数
return function ()
index = index + 1
if index <= count
then
-- 返回迭代器的当前元素
return collection[index]
end
end
end
for element in elementIterator(array)
do
print(element)
end
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。
当我们为 table a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个内存。如果 a 设置为 nil ,则 b 同样能访问 table 的元素。如果没有指定的变量指向a,Lua的垃圾回收机制会清理相对应的内存。
fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
print("连接后的字符串 ",table.concat(fruits))
-- 指定连接字符
print("连接后的字符串 ",table.concat(fruits,", "))
-- 指定索引来连接 table
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))
连接后的字符串 bananaorangeapple 连接后的字符串 banana, orange, apple 连接后的字符串 orange, apple
fruits = {"banana","orange","apple"}
-- 在末尾插入
table.insert(fruits,"mango")
print("索引为 4 的元素为 ",fruits[4])
-- 在索引为 2 的键处插入
table.insert(fruits,2,"grapes")
print("索引为 2 的元素为 ",fruits[2])
print("最后一个元素为 ",fruits[5])
table.remove(fruits)
print("移除后最后一个元素为 ",fruits[5])
索引为 4 的元素为 mango 索引为 2 的元素为 grapes 最后一个元素为 mango 移除后最后一个元素为 nil
fruits = {"banana","orange","apple","grapes"}
print("排序前")
for k,v in ipairs(fruits) do
print(k,v)
end
table.sort(fruits)
print("排序后")
for k,v in ipairs(fruits) do
print(k,v)
end
排序前 1 banana 2 orange 3 apple 4 grapes 排序后 1 apple 2 banana 3 grapes 4 orange
function table_maxn(t)
local mn=nil;
for k, v in pairs(t) do
if(mn==nil) then
mn=v
end
if mn < v then
mn = v
end
end
return mn
end
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
print("tbl 最大值:", table_maxn(tbl))
print("tbl 长度 ", #tbl)
tbl 最大值: 34 tbl 长度 3