Lua编码的一些注意事项

    • 交换变量
    • pairs 和 ipairs区别
    • 取长度操作符’#’
    • lua实现三目运算符
    • select变长参数

交换变量

遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:

x, y = y, x                     -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i]         -- swap 'a[i]' for 'a[j]'

pairs 和 ipairs区别

  • pairs: 迭代 table,可以遍历表中所有的 key 可以返回 nil
  • ipairs: 迭代数组,不能返回 nil,如果遇到 nil 则退出

取长度操作符’#’

它满足 t[n] 不是 nil 而 t[n+1] 为 nil; 此外,如果 t[1] 为 nil ,n 就可能是零。
在获取表的长度时,根据的是表的最大索引的值;
下标越过 1 位以上,长度还是为前面的。

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

如果数组有一个“空洞” (就是说,nil 值被夹在非空值之间), 那么 #t 可能是指向任何一个是 nil 值的前一个位置的下标 (就是说,任何一个nil 值都有可能被当成数组的结束)。

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)  

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

你可能感兴趣的:(lua)