Lua學習筆記之 Type and Values

來源:互聯網
上載者:User

 

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"

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.