Lua编码Tips及常用自定义函数
2020-02-14 本文已影响0人
尘尘飞
编码Tips
交换变量
遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:
x, y = y, x -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'
lua实现三目运算符
三元运算符a?b:c在lua里面可以写成a and b or c
问题:当b是false或者nil时无论a是什么最后结果都会返回c的值
解决:(a and {b} or {c})[1]
local a=5
local b=2
local m=nil
-- local r=a>b and m or b --当m为nil或false时,只会返回c的值
local r=(a>b and {m} or {b})[1]
print(r)
pairs 和 ipairs区别
- pairs: 迭代 table,可以遍历表中所有的 key 可以返回 nil
- ipairs: 迭代数组,不能返回 nil,如果遇到 nil 则退出
取长度操作符’#’
它满足 t[n] 不是 nil 而 t[n+1] 为 nil; 此外,如果 t[1] 为 nil ,n 就可能是零。
在获取表的长度时,根据的是表的最大索引的值;
下标越过 1 位以上,长度还是为前面的。
如果数组有一个“空洞” (就是说,nil 值被夹在非空值之间), 那么 #t 可能是指向任何一个是 nil 值的前一个位置的下标 (就是说,任何一个nil 值都有可能被当成数组的结束)。
tab1 = {key1="1","2"}
print("tab1长度"..#tab2) // tab1长度1
tab2 = {}
tab2[1]="1"
tab2[2]="2"
tab2[4]="4"
print("tab2长度"..#tab3) // tab2长度4
tab3={}
tab3[1]="1"
tab3[2]="2"
tab3[5]="5"
print("tab3的长度",#tab3) // tab3长度2
select变长参数
通常在遍历变长参数的时候只需要使用 {…},然而变长参数可能会包含一些 nil,那么就可以用 select 函数来访问变长参数了:select(‘#’, …) 或者 select(n, …)
- select(‘#’, …) 返回可变参数的长度
- select(n, …) 用于访问 n 到 select(‘#’,…) 的参数
do
function foo(...)
for i = 1, select('#', ...) do -->获取参数总数
local arg = select(i, ...); -->读取参数
print("arg", arg);
end
end
foo(1, 2, 3, 4);
end
常用自定义函数
去除字符串首尾的空格
function trim(s)
return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
end
string1 = " RUNOOB "
string2 = trim(string1)
print(string2)
打印table
function print_r ( t )
local print_r_cache={}
local function sub_print_r(t,indent)
if (print_r_cache[tostring(t)]) then
print(indent.."*"..tostring(t))
else
print_r_cache[tostring(t)]=true
if (type(t)=="table") then
for pos,val in pairs(t) do
if (type(val)=="table") then
print(indent.."["..pos.."] => "..tostring(t).." {")
sub_print_r(val,indent..string.rep(" ",string.len(pos)+8))
print(indent..string.rep(" ",string.len(pos)+6).."}")
elseif (type(val)=="string") then
print(indent.."["..pos..'] => "'..val..'"')
else
print(indent.."["..pos.."] => "..tostring(val))
end
end
else
print(indent..tostring(t))
end
end
end
if (type(t)=="table") then
print(tostring(t).." {")
sub_print_r(t," ")
print("}")
else
sub_print_r(t," ")
end
print()
end
table去重
table = {1 , 2 , 3 , 4 , 20 , 6 , 7 , 7 , 15 , 28};
function table_unique(t)
local check = {};
local n = {};
for key , value in pairs(t) do
if not check[value] then
n[key] = value
check[value] = value
end
end
return n
end
for key , value in pairs(table_unique(table)) do
print('value is ' , value)
end
table的长度
当我们获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。
可以使用以下方法来代替:
function table_leng(t)
local leng=0
for k, v in pairs(t) do
leng=leng+1
end
return leng;
end
table最大值
table.maxn 在 Lua5.2 之后该方法已经不存在了,我们定义了 table_maxn 方法来实现。
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)
将阿拉伯数字转换为语文汉字数字
local function NumToCN(num)
local size = #tostring(num)
local CN = ""
local StrCN = {"一","二","三","四","五","六","七","八","九"}
for i = 1 , size do
CN = CN .. StrCN[tonumber(string.sub(tostring(num), i , i))]
end
return CN
end
print(NumToCN(56665))