Lua學習筆記之 Type and Values

2021-09-30 03:15:59 字數 2654 閱讀 2770

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

endfunction func_2( para )

para = para+2

return para

endfunc_table =

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"

Lua學習筆記之模組

模組require 使用模組 module 建立模組 通過require 來載入乙個模組,返回乙個全域性變數table型別。local a require mod foo require 函式,搜尋模組名時,使用乙個 分隔的路徑。我遇到過乙個載入路徑的問題,最後得到的結論是 那一串路徑中一般第乙個 ...

Lua學習筆記之table

零散知識點記錄 table的拷貝是淺拷貝,若要深拷貝a b則需要遍歷b中的元素,並將其一一對應賦值給a。乙個table剛初始化時,是沒有metatable的,必須通過setmetatable給table賦予metatable,table才有metatable。所以若想直接用table 來初始化乙個t...

Lua學習筆記之函式

與主題無關 exp3預設為1 for var exp1 exp2 exp3 do 執行體 end標準庫中提供了幾種迭代器 io.lines 用於迭代檔案中每行 pairs 迭代table中元素 ipairs 迭代 陣列 元素 string.gmatch 迭代字串中單詞多重返回值 x y foo fo...