不須要 「 ;」分隔符html
> a = 1 > b = a + 1
lua中換行不起任何做用。json
標識符
能夠任意字母,數字和下劃線構成,但不能以數字開頭。
一般保留標識符一個或者多個「_」下劃線和
變量無需聲明類型,無需在首次使用前聲明大寫字母的使用,它們保留作特殊用途。數組
註釋
單行註釋:「--」
多行註釋:「 - -[[…]]- -「函數
全局變量不須要聲明
訪問未聲明的變量不會報出lua
> print(b) nil
對於生命週期比較短的變量應該用局部變量,用 local 聲明code
不須要事先聲明變量類型
lua是一種動態語言,沒有類型定義的語法
變量能夠被賦值下面8種類型:nil,table,boolean,number,string,funtion,userdate ,threadhtm
> print(a) nil > a = print > type(a) function
支持多個變量同時賦值blog
> x, y = 3, 5 > print(x * y) 15
非的邏輯運算符是~而非!
^ 運算符爲冪運算而非異或運算索引
邏輯運算
短路求值,不一樣之處是返回操做數,而非布爾值生命週期
> print (true and 10) 10
只能對兩個數字或者兩個字符串作大小性比較。當對兩個不一樣類型的值作比較時,須要當心。
> print( 0 == "0") false > print( "2" < "15" ) false
在lua中只有nil , false 才被計算爲bool false, 其餘類型的數據計算爲true
多行字符串能夠用
a = [[adsd
asdfsdf]]
變量的做用範圍
在Lua中能夠手動劃分代碼塊, 使用的是do-end語句:
> do >> local i = 10 >> print(i) >> end 10 > print(i) nil
用repeat-until 能夠實現do - while的效果
沒有 += , -=, ++, — ,*+ 等操做符
參數表中的三個點(...)表示該函數可接受不一樣數量的實參
> function add( ... ) >> local s = 0 >> for i, v in ipairs{ ... } do >> s = s + v >> end >> return s >> end > print(add(3,1,2,9)) 15
closure 閉合函數,一個閉合函數就是一個函數加上改函數所需訪問的多有「非局部變量」
> function newCounter() >> local i = 0 >> return function() >> i = i + 1 >> return i >> end >> end > c1 = newCounter() > print(c1()) 1 > print(c1()) 2 > print(c1()) 3 > c2 = newCounter() > print(c2()) 1
table
table是lua的一個很重要的特性, 能夠存儲任意數據類型
做用相似於數組,卻有很大的差別。而且,lua中起始的index值是從1開始。
遍歷方式
for k,v in pairs(t) do body end
能迭表明 t 中的全部鍵值對。
> name = {"json", "john","zoe", "katy"} > for key, value in pairs(name) do >> print( key, value) >> end 1 json 2 john 3 zoe 4 katy
能夠用 pairs來遍歷table中所有的值
此外,lua中還有一 ipairs 按照天然索引值遍歷,直到索引中斷
for i,v in ipairs(t) do body end
將迭代鍵值對(1,t1) ,(2,t[2]), ... ,直到第一個空值。
> case1 = { >> [1] = 1, >> [2] = 2, >> name = "john", >> age = 31 >> } > for key, value in ipairs(case1) do >> print( key, value ) >> end 1 1 2 2
添加和刪除
> t = {10,9,9} > table.insert( t, 1, 2) > for i=1, #t do >> print( t[i] ) >> end 2 10 9 9 >
table.insert (list, [pos,] value)
在 list 的位置 pos 處插入元素 value , 並後移元素 list[pos], list[pos+1], ···, list[#list] 。 pos 的默認值爲 #list+1 , 所以調用 table.insert(t,x) 會將 x 插在列表 t 的末尾。
> print( table.insert( t, 100) ) > for i=1, #t do >> print(t[i]) >> end 2 10 9 9 100
table.insert 是沒有返回值
table.remove (list [, pos])
移除 list 中 pos 位置上的元素,並返回這個被移除的值。 當 pos 是在 1 到 #list 之間的整數時, 它向前移動元素 list[pos+1], list[pos+2], ···, list[#list] 並刪除元素 list[#list]; 索引pos 能夠是 #list + 1 ,或在 #list 爲 0 時能夠是 0 ; 在這些狀況下,函數刪除元素 list[pos]。
> print( table.remove(t, 2) ) 10 > for key, value in pairs(t) do >> print(key, value) >> end 1 2 2 9 3 9 4 100 >
刪除方法中,回返回刪除索引對應的值
數組長度 長度操做符「#」, 用於返回一個數組或者線性表的最後一個索引值
5.3中拋棄了table.maxn 由於不管什麼時候,若一個操做須要取表的長度, 這張表必須是一個真序列,或是擁有 __len 元方法 (參見 §3.4.7 )。 全部的函數都忽略傳入參數的那張表中的非數字鍵。
table.sort (list [, comp])
> ss = {} > next(ss) nil > table.sort(t) > for key, value in pairs(t) >> do >> print( key, value ) >> end 1 2 2 9 3 9 4 100 > table.unpack(t) 2 9 9 100 > table.unpack(case1) 1 2