主頁 > 知識(shí)庫 > Lua中的變量類型與語句學(xué)習(xí)總結(jié)

Lua中的變量類型與語句學(xué)習(xí)總結(jié)

熱門標(biāo)簽:服務(wù)外包 呼叫中心市場需求 AI電銷 地方門戶網(wǎng)站 網(wǎng)站排名優(yōu)化 百度競價(jià)排名 鐵路電話系統(tǒng) Linux服務(wù)器

1. Lua類型
1.1 基本類型

Lua是一種動(dòng)態(tài)類型語言,沒有類型定義的語法。Lua一共有8種基礎(chǔ)類型:nil(空)、boolean(布爾)、number(數(shù)字)、string(字符串)、userdata(自定義類型)、function(函數(shù))、thread(線程)、table(表)。

函數(shù)type可根據(jù)一個(gè)值返回其類型名稱(字符串),如print(type(print)),輸出“function”;print(type(type(X))) ,輸出“string”。(這里不管X有沒有定義,type(X)總是返回字符串)

1.2 各類型要注意的地方

(1)關(guān)于boolean:

在Lua中,false和nil視為“false”,其它值均視為“true”(包括數(shù)字0和空字符串)。
(2)關(guān)于number:

該類型用于表示實(shí)數(shù)(雙精度double),整數(shù)也用此類型表示。
(3)關(guān)于string:

字符串不能像C語言一樣直接修改某個(gè)字符,必要時(shí)應(yīng)通過string庫創(chuàng)建一個(gè)新的字符串。字符串可以用一對(duì)匹配的單引號(hào)或雙引號(hào)來界定??梢詫?shí)用類C語言的轉(zhuǎn)義序列。

此外,可以用雙方括號(hào)[[內(nèi)容]]來界定,其中的換行字符均被忽略,適用于包含一整段的字符串。若在左邊的兩個(gè)方括號(hào)間加入任意數(shù)量的等號(hào),如[===[,則字符串右邊應(yīng)該匹配帶相同數(shù)量等號(hào)的方括號(hào),如]===],這樣做就可以在不加轉(zhuǎn)義的情況下直接嵌入任意內(nèi)容的字符串。同理注釋也可以這樣使用,如--[==[匹配--]==]。

Lua提供運(yùn)行時(shí)的數(shù)字與字符串自動(dòng)轉(zhuǎn)換。如print("10"+1) –> 11,print(10 ..20) –> 1020(“..”是字符串連接符,上例將數(shù)字轉(zhuǎn)換成字符串并連接,數(shù)字和..之間應(yīng)該留一個(gè)空格)。

建議盡量少用自動(dòng)轉(zhuǎn)換,如有需要可用強(qiáng)制轉(zhuǎn)換。函數(shù)tonumber(x)嘗試將x轉(zhuǎn)換成數(shù)字,若失敗則返回nil,函數(shù)tostring(x)將x轉(zhuǎn)換成字符串。在字符串前放置“#”可獲得字符串的長度,如print(#"length") –> 6。
(4)關(guān)于table:

Table是一種具有特殊索引方式的數(shù)組,可以實(shí)用除nil外的其他類型的值作為索引,其增長與刪減均通過自動(dòng)內(nèi)存管理來完成。Table是一個(gè)“對(duì)象”,程序僅持有一個(gè)對(duì)它們的引用,例如可以通過a = {}創(chuàng)建一個(gè)table并將它的引用存儲(chǔ)到a,若再b = a,則b與a引用同一個(gè)table。若table的某個(gè)元素沒有初始化,其值即為nil,可以通過賦nil來刪除table的某個(gè)元素。

有一種等價(jià)寫法:p["age"]等價(jià)于p.age。注意,p.age和p[age]并不等價(jià)。

“#”可用于返回一個(gè)數(shù)組的最后一個(gè)索引值(或其大?。?。例如print(a[#a])打印列表a的最后一個(gè)值,a[#a+1] = io.read()讀入一個(gè)值并插入到列表a末尾。注意,Lua將nil作為界定數(shù)組結(jié)尾的標(biāo)志,當(dāng)一個(gè)數(shù)組中間含有nil時(shí),#會(huì)認(rèn)為第一個(gè)nil就是結(jié)尾,因此應(yīng)避免對(duì)含“空隙”的數(shù)組使用#。

在Lua中,一般默認(rèn)table第一個(gè)索引為1而不是C語言中的0。
Function、userdata和thread類型留到以后再講。

2. 表達(dá)式
2.1. 算術(shù)操作符

常規(guī)的操作符有:+加、-減、*乘、/除、^指數(shù)、%取模。其中^可用于任意實(shí)數(shù),如x ^ (-1 / 3)計(jì)算x的立方根倒數(shù)。%可以這樣使用:x % 1結(jié)果是x的小數(shù)部分,x - x % 0.01是x精確到小數(shù)點(diǎn)后兩位的結(jié)果。

2.2. 關(guān)系操作符

常規(guī)關(guān)系操作符有:小于、>大與、=小于等于、>=大于等于、==相等、~=不等。==和~=可用于任意兩個(gè)值,若兩個(gè)值具有不同類型則不相等,有相同類型則作正常比較(nil只與其自身相等)。對(duì)于對(duì)象則比較它們的引用。

2.3. 邏輯操作符

邏輯操作符有and、or和not。對(duì)and(or)來說,若第一個(gè)操作數(shù)為假(真),就返回第一個(gè)操作數(shù),否則返回第二個(gè)操作數(shù)。如print(4 and 5) –> 5,print(false or 5) –> 5。

有一些常用寫法:x = x or v,可用在沒有設(shè)置x的時(shí)候,將其設(shè)為一個(gè)默認(rèn)值v。另一種寫法(a and b) or c類似a ? b : c,如max = (x > y) and x or y。

2.4. 字符串連接符

可用“..”(兩個(gè)點(diǎn))來連接兩個(gè)字符串,若其中任一個(gè)為數(shù)字,Lua會(huì)自動(dòng)轉(zhuǎn)換,如print(0 ..1) –> 01。連接字符串只會(huì)創(chuàng)建一個(gè)新字符串,不會(huì)對(duì)原操作數(shù)進(jìn)行修改。

Lua運(yùn)算符優(yōu)先級(jí)順序如下圖所示。

2.5. Table構(gòu)造式

除了上述直接賦予{}創(chuàng)建空table以外,可以初始化其值,如day = {"S", "M", "T"},或者point = {x = 10, y = 20}(即point.x=10,point.y=20)。以上兩種初始化方式可以混用,還可以用分號(hào)代替逗號(hào),來將列表部分和記錄部分明顯地分隔開,如polyline = {color = "blue"; {x = 0, y = 0}, {x = 10, y = 10}, {x = 20, y = 30}},則print(polyline[2].x)` –> 10。

更加通用的初始化格式,可以在方括號(hào)間聲明索引值,如opnames={["+"] = "add", ["-"] = "minus"}。若某些情況真的需要以0作為一個(gè)數(shù)組的起始索引,可以這樣days={[0] = "S", "M", "T"}。但是不推薦在Lua中以0作為索引起始值,因?yàn)榇蠖鄶?shù)內(nèi)建函數(shù)都假設(shè)數(shù)組起始于索引1。

3. 順序結(jié)構(gòu)
3.1. 賦值

除了普通的用“=”賦值之外,Lua還允許多重賦值,每個(gè)值和每個(gè)變量之間用逗號(hào)分隔。Lua總會(huì)將等號(hào)右邊值的個(gè)數(shù)調(diào)整到與左邊變量個(gè)數(shù)一致,若值個(gè)數(shù)少了,則多余的變量將賦予nil;若值個(gè)數(shù)多了,則多余的值會(huì)被丟棄。如a, b = 10, 2 * x,x, y = y, x(交換)。多重賦值一般用于交換兩個(gè)變量的值,或者接受一個(gè)函數(shù)的多個(gè)返回值。

3.2. 局部變量與程序塊

相對(duì)于全局變量,Lua還提供了局部變量,給變量加上限定詞local即可。局部變量的作用域僅限于聲明它們的那個(gè)程序塊(如控制結(jié)構(gòu)的執(zhí)行體、函數(shù)等)。

注意,在交互模式中每行輸入內(nèi)容自身就形成了一個(gè)程序塊,因此單句local聲明沒有效果??梢燥@式界定一個(gè)塊,將內(nèi)容放入一對(duì)do-end關(guān)鍵字中即可,這個(gè)方法也可以用于嚴(yán)格控制某些局部變量的作用域。

有一種習(xí)慣寫法local foo = foo,創(chuàng)建一個(gè)局部變量foo并用全局變量foo的值初始化它。若后續(xù)其他函數(shù)改變?nèi)肿兞縡oo的值,可以在這里先將其保存起來。

4. 控制結(jié)構(gòu)
所有控制結(jié)構(gòu)語句都有一個(gè)顯示的終止符:if、for、和while以end結(jié)尾,repeat以u(píng)ntil結(jié)尾。

4.1. if then else(elseif)語句

格式:if 條件1> then 內(nèi)容1> elseif 條件2> then 內(nèi)容2> else 內(nèi)容3> end
Lua中不支持switch語句,所以一連串if elseif語句是很常見的。

4.2. while和repeat語句

格式:while 條件> do 循環(huán)體> end

格式:repeat 循環(huán)體> until 條件>
在Lua中,一個(gè)聲明在循環(huán)體內(nèi)的局部變量的作用域包括循環(huán)的條件測試。

4.3. 數(shù)字型for語句

格式:for var=exp1, exp2, exp3 do 循環(huán)體> end
上式表示var從exp1變化到exp2,以exp3作為步長遞增var。其中exp3是可選的,若不指定則默認(rèn)步長為1。如果將exp2設(shè)為math.huge,則為無限循環(huán)。

有一些細(xì)節(jié)需要注意。for的3個(gè)表達(dá)式是在循環(huán)開始前一次性求值的,以后將不再求值。另外,控制變量會(huì)被自動(dòng)地聲明為for語句的局部變量,僅在循環(huán)體內(nèi)可見。

4.4. 泛型for語句

泛型for循環(huán)通過一個(gè)迭代器來遍歷所有值,如for i,v in ipairs(tableA) do print(v) end,其中i被賦予索引值,而v被賦予對(duì)應(yīng)的元素值。其中ipairs(array)函數(shù)用于遍歷數(shù)組并返回?cái)?shù)字下標(biāo)-元素值對(duì),pairs(table)函數(shù)用于遍歷table并返回鍵-值對(duì),string.gmatch(string)迭代字符串中的單詞。

泛型for的一個(gè)應(yīng)用是創(chuàng)建逆向table,即新table的鍵值與原table鍵值反轉(zhuǎn)。

4.5. break和return語句

這兩個(gè)語句都用于跳出當(dāng)前的語句塊,break結(jié)束一層循環(huán),return結(jié)束一個(gè)函數(shù)的執(zhí)行。如果剛定義了一個(gè)function然后直接要在一開始就跳出函數(shù)作為調(diào)試用,可以用一個(gè)顯示的do塊來包含return語句,即function foo() do return end end。

您可能感興趣的文章:
  • Lua中的變量和流控制入門學(xué)習(xí)
  • 詳解Lua中的變量相關(guān)知識(shí)點(diǎn)
  • Lua教程(十): 全局變量和非全局的環(huán)境
  • Lua判斷變量是否為數(shù)字、字符串是否可以轉(zhuǎn)換為數(shù)字等
  • Lua中創(chuàng)建全局變量的小技巧(禁止未預(yù)期的全局變量)
  • C語言中通過LUA API訪問LUA腳本變量的簡單例子
  • Lua變量類型簡明總結(jié)
  • Lua中的全局變量、非全局變量總結(jié)
  • Lua中全局變量與非全局環(huán)境介紹
  • Lua中的變量與賦值方法

標(biāo)簽:湖南 蘭州 銅川 湘潭 黃山 衡水 崇左 仙桃

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中的變量類型與語句學(xué)習(xí)總結(jié)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266