1. lua型別
1.1 基本型別
lua是一種動態型別語言,沒有型別定義的語法。lua一共有8種基礎型別:nil(空)、boolean(布林)、number(數字)、string(字串)、userdata(自定義型別)、function(函式)、thread(執行緒)、table(表)。
函式type可根據乙個值返回其型別名稱(字串),如print(type(print)),輸出「function」;print(type(type(x))) ,輸出「string」。(這裡不管x有沒有定義,type(x)總是返回字串)
1.2 各型別要注意的地方
(1)關於boolean:
在lua中,false和nil視為「false」,其它值均視為「www.cppcns.comtrue」(包括數字0和空字串)。
(2)關於number:
該型別用於表示實數(雙精度double),整數也用此型別表示。
(3)關於string:
字串不能像c語言一樣直接修改某個字元,必要時應通過string庫建立乙個新的字串。字串可以用一對匹配的單引號或雙引號來界定。可以實用類c語言的轉義序列。
此外,可以用雙方括號[[內容]]來界定,其中的換行字元均被忽略,適用於包含一整段的字串。若在左邊的兩個方括號間加入任意數量的等號,如[===[,則字串右邊應該匹配帶相同數量等號的方括號,如]===],這樣做就可以在不加轉義的情況下直接嵌入任意內容的字串。同理注釋也可以這樣使用,如--[==[匹配--]==]。
lua提供執行時的數字與字串自動轉換。如print("10"+1) –> 11,print(10 ..20) –> 1020(「..」是字串連線符,上例將數字轉換成字串並連線,數字和..之間應該留乙個空格)。
建議盡量少用自動轉換,如有需要可用強制轉換。函式tonumber(x)嘗試將x轉換成數字,若失敗則返回nil,函式tostring(x)將x轉換成字串。在字串前放置「#」可獲得字串的長度,如print(#"length") –> 6。
(4)關於table:
table是一種具有特殊索引方式的陣列,可以實用除nil外的其他型別的值作為索引,其增長與刪減均通過自動記憶體管理來完成。table是乙個「物件」,程式僅持有乙個對它們的引用,例如可以通過a = {}建立乙個table並將它的引用儲存到a,若再b = a,則b與a引用同乙個table。若table的某個元素沒有初始化,其值即為nil,可以通過賦nil來刪除table的某個元素。
有一種等價寫法:p["age"]等價於p.age。注意,p.age和p[age]並不等價。
「#」可用於返回乙個陣列的最後乙個索引值(或其大小)。例如print(a[#a])列印列表a的最後乙個值,a[#a+1] = io.read()讀入乙個值並插入到列表a末尾。注意,lua將nil作為界定陣列結尾的標誌,當乙個陣列中間含有nil時,#會認為第乙個nil就是結尾,因此應避免對含「空隙」的陣列使用#。
在lua中,一般預設table第乙個索引為1而不是c語言中的0。
function、userdata和thread型別留到以後再講。
2. 表示式
2.1. 算術操作符
常規的操作符有:+加、-減、*乘、/除、^指數、%取模。其中^可用於任意實數,如x ^ (-1 / 3)計算x的立方根倒數。%可以這樣使用:x % 1結果是x的小數部分,x - x % 0.01是x精確到小數點後兩位的結果。
2.2. 關係操作符
常規關係操作符有:小於、>大與、<=小於等於、>=大於等於、==相等、~=不等。==和~=可用於任意兩個值,若兩個值具有不同型別則不相等,有相同型別則作正常比較(nil只與其自身相等)。對於物件則比較它們的引用。
2.3. 邏輯操作符
邏輯操作符有and、or和not。對and(or)來說,若第乙個運算元為假(真),就返回第乙個運算元,否則返回第二個運算元。如print(4 and 5) –> 5,print(false or 5) –> 5。
有一些常用寫法:x = x or v,可用在沒有設定x的時候,將其設為乙個預設值v。另一種寫法(a and b) or c類似a ? b : c,如max = (x > y) and x or y。
2.4. 字串連線符
可用「..」(兩個點)來連線兩個字串,若其中任乙個為數字,lua會自動轉換,如print(0 ..1) –> 01。連線字串只會建立乙個新字串,不會對原運算元進行修改。
lua運算子優先順序順序如下圖所示。
2.5. table構造式
除了上述直接賦予{}建立空table以外,可以初始化其值,如day = ,或者point = (即point.x=10,point.y=20)。以上兩種初始化方式可以混用,還可以用分號代替逗號,來將列表部分和記錄部分明顯地分隔開,如polyline = , , },則print(polyline[2].x)` –> 10。
更加通用的初始化格式,可以在方括號間宣告索引值,如opnames=。若某些情況真的需要以0作為乙個陣列的起始索引,可以這樣days=。但是不推薦在lua中以0作為索引起始值,因為大多數內建函式都假設陣列起始於索引1。
3. 順序結構
3.1. 賦值
除了普通的用「=」賦值之外,lua還允許多重賦值,每個值和每個變數之間用逗號分隔。lua總會將等號右邊值的個數調整到與左邊變數個數一致,若值個數少了,則多餘的變數將賦予nil;若值個數多了,則多餘的值會被丟棄。如a, b = 10, 2 * x,x, y = y, x(交換)。多重賦值一般用於交換兩個變數的值,或者接受乙個函式的多個返回值。
3.2. 區域性變數與程dgwqyzmyu序塊
相對於全域性變數,lua還提供了區域性變數,給變數加上限定詞local即可。區域性變數的作用域僅限於宣告它們的那個程式塊(如控制結構的執行體、函式等)。
注意,在互動模式中每行輸入內容自身就形成了乙個程式塊,因此單句local宣告沒有效果。可以顯式界定乙個塊,將內容放入一對do-end關鍵字中即可,這個方法也可以用於嚴格控制某些區域性變數的作用域。
有一種習慣寫法local foo = foo,建立乙個區域性變數foo並用全域性變數foo的值初始化它。若後續其他函式改變全域性變數foo的值,可以在這裡先將其儲存起來。
4. 控制結構
所有控制結構語句都有乙個顯示的終止符:if、for、和while以end結尾,repeat以until結尾。
4.1. if then else(elseif)語句
格式:if 條件1> then 內容1&程式設計客棧gt; elseif 條件2> then 內容2> else 內容3> end
lua中不支援switch語句,所以一連串if elseif語句是很常見的。
4.2. while和repeat語句
格式:while 條件》 do 迴圈體》 end
格式:repeat & until 條件》
在lua中,乙個宣告在迴圈體內的區域性變數的作用域包括迴圈的條件測試。
4.3. 數字型for語句
格式:for var=exp1, exp2, exp3 do 迴圈體》 end
上式表示var從exp1變化到exp2,以exp3作為步長遞增var。其中exp3是可選的,若不指定則預設步長為1。如果將exp2設為math.huge,則為無限迴圈。
有一些細節需要注意。for的3個表示式是在迴圈開始前一次性求值的,以後將不再求值。另外,控制變數會被自動地宣告為for語句的區域性變數,僅在迴圈體內可見。
4.4. 泛型for語句
泛型for迴圈通過乙個迭代器來遍歷所有值,如for i,v in ipairs(tablea) do print(v) end,其中i被賦予索引值,而v被賦予對應的元素值。其中ipairs(array)函式用於遍歷陣列並返回數字下標-元素值對,pairs(table)函式用於遍歷table並返回鍵-值對,string.gmatch(string)迭代字串中的單詞。
泛型for的乙個應用是建立逆向table,即新table的鍵值與原table鍵值反轉。
4.5. break和return語句
這兩個語句都用於跳出當前的語句塊,break結束一層迴圈,return結束乙個函式的執行。如果剛定義了乙個function然後直接要在一開始就跳出函式作為除錯用,可以用乙個顯示的do塊來包含return語句,即function foo() do return enwww.cppcns.comd end。
本文標題: lua中的變數型別與語句學習總結
本文位址:
Lua中的語句
賦值 賦值的基本含義是修改乙個變數或乙個table中字段的值,這個和其它語言沒有多少區別,但是對於lua,有乙個特性,它允許 多重賦值 也就是一下子將多個值賦予多個變數,例如以下 local x1,x2 2,4 print x1 2 print x2 4 在多重賦值中,lua先對等號右邊的所有元素求...
lua認識 lua 中的變數
認識lua中的變數 在lua所有變數都不需要在使用前宣告,同樣不需要指定變數的型別 int,char,string 因為變數的型別 取決於使用者給它賦的值.lua中的所有變數的資料型別不是顯示的,它隨著它的賦值而變動,但我們基於該變數作用範圍分為 三種型別 全域性變數 所有的變數預設是全域性 除非顯...
Lua神奇之旅 lua中的變數
對於指令碼語言lua,它採用的是自動記憶體管理機制,所以使用時無需考慮記憶體的釋放和分配,直接用即可 他的變數型別為以下8種 nilnil是一種特殊的型別,它只有乙個值nil 主要功能就是為了區別lua中其他的值,lua中的對於他的定義是一種 無效值 類似於c 中的null boolean其實就是傳...