lua是一種動態類型語言, 不用特別聲明變數以及指定類型, 首次賦值即為聲明. 說到此點, 我覺得動態語言的這種特點與彙編倒是蠻象的: 不管你是什麼類型, 對於底層而言, 它代表的就是一記憶體位址, 而操作符代表的就是對這些地址及存在於這些地址裡的量進行操作而已. 閑話少說, 繼續看pil, 今天的內容是: types and values.
筆記內容:
1. lua提供了八種資料類型: nil, boolean, string, number, userdata, function, thread, table. 如果想看某個運算式是何種類型的, 可以使用type()函數, 它的傳回值是string類型:
> print(type(10.4*3))
number
> print(type(type(10.4*3)))
string
2. 一個變數, 可以被多次賦以任何類型的值. 相比之下, lua中使用函數指標時的簡單, 到了令人咋舌的程度: 再也不需要象c裡那樣弄個指標傳來傳去的了, 比如: a = print , 而後就可以用a(3)來列印運算式的值了. 讓我覺得最爽的一點就是: 使用table+函數賦值的方式, 可以非常容易的實現函數表, 從而避免出現大量的if else語句. 形如下:
function func_1( para )
para = para + 1
return para
end
function func_2( para )
para = para+2
return para
end
func_table = {
["func1"] = func_1,
["func2"] = func_2,
}
print ( func_table["func1"](1) )
列印的結果是:
2
選擇string作為 key, 是為了讓你瞭解在lua裡, 作函數表是如何的方便.
3. 全域變數在第一次賦值前, 預設是nil; 刪除全域變數, 也是將此變數賦值為nil. nil值, 也常作為函數的無效傳回值來使用.
4. boolean類型有兩個值: false 和 true( 全為小寫 ). 在條件運算式中, 只有false和nil才表示假, 其餘任何值均表示真(0也表示真). 比如這些值:
if false then print( "ok" ) end
if nil then print("ok") end
if "" then print("ok") end
if '' then print( "ok" ) end
if "haha" then print( "ok") end
if 0 then print("ok") end
在上面的這些語句中, 只有前兩條語句列印不出ok, 其它皆可以.
5. 對於number類型, lua只提供real實型數. 沒有整數類型, 按pil的說法: as it does not need it.... Moreover, most modern CPUs do floating-point arithmetic as fast as (or even faster than) integer arithmetic. 我想, lua自身的這些"狡辯"已經有足夠的說服力, 不用再羅索了. 什麼叫自由? 看這裡:
>print( string.sub( "hello", 1.1, 2.2 ) )
he
其效果等同於: print( string.sub( "hello", 1, 2 ) )
6. 都說lua的string類型功能很強大, 可就目前我的使用而言, 並沒有感受到這種強大給我帶來的更多的便利性, 我想, 可能還是碼lua碼得少了. lua裡的string類型, 可以存放任意長的字串, 一個字串, 一旦建立便不可更改. 有人說, 這樣操作起來豈不是效率很低? 其實, 也不盡然, 你想嘛, 那些對串進行操作的函數: sub, find, copy, replace, cat等等. 其中, 很多確實本身並沒有要求一定要修改串本身, 很多函數都是不修改串的, 而同時, 修改串的那些操作,
還不如直接建立一個新串來得方便. lua對字串的記憶體管理, 還是比較棒的, 編程者不用去管它的分配與回收, lua會根據自己的一套引用計數機制來自行決定何時釋放掉這個串, 同時, 正是由於不可修改串本身, 也使得lua的字串操作變成了單純的引用操作, 這樣效率應該是更高了.
字串常量, 可以使用單引號, 也可以使用雙引號括起來. 但是, 要培養一種良好的編程習慣: 固定使用一種風格的聲明形式. 逸出字元, 一樣在前面加 "/" . 以/ 後引出的數字, 可以表示一個asc字元, 但/的數字最多不會超過3位.
定義含有多行的字串時, 可以使用 [[ ]] 標識, 這樣就不用在每行之間加/n作轉義了.
lua 提供字串與number類型之間的自動轉換功能. 所謂的自動轉換, 就是視調用時的函數行為, 決定當前的操作是按字串處理, 還是按數值型處理, 比如: "10"+1, 這種情況會按數文書處理, 因為字元 串沒有加法操作, 如果想串連兩個字串, 要用 .. 運算子. 而 "10"..1, 其結果為: 101 . 當然, "a"+1這樣的操作, 是非法的, 因為lua的轉換, 並不是按asi來作, 而是等於執行了一個 atoi( "10"), 然後再加1.
在其它場合, 如果要將字串轉為數字, 使用tonumber, 轉換失敗時, 返回nil. 比如: tonumber("a")傳回值就為nil. 如果要將數字轉換成字串, 有兩種方法: 一種是使用tostring函數, 一種是使用串連符將數字和一個空串聯接起來: 10.."", 其結果為:"10"