Lua學習筆記3. 函數可變參數和運算符、轉義字符串、數組


1。 Lua函數可以接受變長數目的參數,和C語言類似,在函數的參數列表中使用(...)表示函數可以接受變長參數

lua函數將參數存放在一個table中,例如arg,那么#arg可以獲得參數的個數

function func_no_p(...)

  local arg={...}

  for k,v in pairs(arg} do

    print(v ..",")

  end

  print("輸入參數個數:".. #arg)

end

func_no_p(1,2,34,1,"string")

 

 

 

2. 運算符方面需要注意的就是 不等式符號和matlab一樣 ~=,還有各種運算符的優先級

^
not  - (unary) --這里是符號
*         /
+        -
..
<        >        <=        >=        ~=        ==
and
or

除了^ 和 .. 外所有的二元運算符都是左連續的。

這里要特別注意的是 x^y^2 等價於 x^(y^2)

 

3. 轉義字符串

轉義字符   意義          ASCII碼    
\a 響鈴           007
\b 退格(BS),將當前位置移到前一列   008
\f   換頁(FF),將當前位置移到下頁開頭 012
\n     換行(LF) 010
\r 回車(CR) 013
\t 水平制表符 009
\v    垂直制表 011
\\ \ 092
\' ' 039
\" " 034
\0 空字符 000
\ddd 八進制 三位八進制
\xhh 十六進制 二位十六進制

 

 

 

 

 

 

 

 

 

 

4. 字符串的一些重要操作

string.upper(argument)

string.lower(argument)

string.gsub(mainString,findString,replaceString,num) --字符串替換

  其中num表示要替換的次數,如果num大於等於包含的fingString次數,或者num省略就全部替換,否則從前往后替換num個

  > string.gsub("Hello",'l','ee')

  輸出 Heeeeeo 2,兩個值

string.find(str,substr,[init,[end]])

  其中[ ]是可選參數表示尋找區間,返回兩個值表示子串在原串中起始和終止index

  > string.find("Lua is aa new wapon",'ea',5,10)

  輸出 16     17

string.reverse(arg)

string.format(...)

  格式化字符串,例如string.format('the value is %7.0d',4)  輸出占位7位的4

string.char(arg),string.byte(arg[,int])

  將整型數字轉變成字符串連接,和將字符串arg中的首字符或者int指定字符轉換成整數值

  > string.char(97,65,48) 輸出 aA0

  >string.byte("Hello") 輸出72

string.len(arg) 和#arg相同功能,統計arg的長度

string.rep(string,n) 拷貝n次字符串

..  字符串的連接

 

5. Lua數組

Lua中一維數組和多維數組都是table,只不過多維數組中table的每一個索引還對應着table

需要注意的是table的索引可以自己設定值,那么就不限定從0還是從1開始計數了,但默認情況下是從1開始計數的。

如果使用不存在的索引或者超出索引范圍的話,返回nil

二維數組實例

arr={}
for i=1,3 do
    arr[i]={}
    for j=1,3 do
        a[i][j]=i*j
    end
end

for i=1,3 do
    for j=1,3 do
        print(arr[i][j])
    end
end

-- 另一種索引
arr={}
maxRows=3
maxCols=3
for row=1,maxRows do
    for col=1,maxCols do
        arr[row*maxCols+col]=row*col     -- 注意這里並不是從0或者1開始索引的
     end
end

for row=1,maxRows do
    for col=1,maxCols do
        print(arr[row*maxCols+col])
    end
end

 

6. 迭代器

迭代器包括無狀態迭代器和多狀態迭代器,迭代器一般由迭代函數,‘狀態常量’和‘控制變量’組成,其中狀態常量和控制常量是迭代函數的輸入參數

迭代函數往往輸出兩個值: 控制參數和該控制參數下的函數值,比如我們定義如下的迭代器

function tabSearch(tab1, curIdx)
    MaxCount = #tab1
    if curIdx<maxCount then
        curIdx=curIdx+1
        return curIdx, tab1[curIdx]
    end
end
tab1={1,2,3,4,5}
for k,v in tabSearch, tab1,0 do
    print(v)
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

其實無狀態和多狀態迭代器的差別並不大,無狀態迭代器的參數只有狀態常量和控制變量,就好比數組中的最大長度和索引;而多狀態迭代器需要在迭代函數中傳遞許多參數,因此可以利用數組作為狀態常量輸入,如上面的tabSearch迭代函數

 

7. table操作 (首先lua有垃圾自動回收機制)

table.concat(table,[,sep [,start [,end]]]): 其中sep定義了連接的分隔符,start,end定義了連接的后面的table中范圍

table.insert(table,[pos,] value ])

table.remove(table[,pos])

table.sort(table[,comp]):對指定的table升序排列

  

days={'Mon',"Tue","Wed","Thu","Fri"}
string1="排序前:"
for k,v in ipairs(days) do
    string1=string1.. v.." "
end
print(string1)

table.sort(days)
string2="排序后:"
for k,v in pairs(days) do
    string2=string2..v.." "
end
print(string2)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM