Lua 筆記-lua的不同凡響處

不須要 「 ;」分隔符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

注:參考文章
筆記: LUA基礎: INTERPRETER,特殊的程序語法

相關文章
相關標籤/搜索