1、Lua 基礎

YunSoul發表於2018-08-27
Lua是屬於引用型別的語言,Lua中一切皆引用。
Lua中的任何資料型別的定義都是包含名字和記憶體兩部分,名字都是指向記憶體的。

一、Lua 基本語法

1、單行註釋

兩個減號是單行註釋:

--

2、多行註釋

--[[ 多行註釋 多行註釋 --]]

3、全域性變數

在預設情況下,變數總是認為是全域性的。

全域性變數不需要宣告,給一個變數賦值後即建立了這個全域性變數,訪問一個沒有初始化的全域性變數也不會出錯,只不過得到的結果是:nil。

二、Lua 資料型別

資料型別 描述
nil 這個最簡單,只有值nil屬於該類,表示一個無效值(在條件表示式中相當於false)。
boolean 包含兩個值:false和true。
number 表示雙精度型別的實浮點數
string 字串由一對雙引號或單引號來表示
function 由 C 或 Lua 編寫的函式
userdata 表示任意儲存在變數中的C資料結構
thread 表示執行的獨立線路,用於執行協同程式
table Lua 中的表(table)其實是一個"關聯陣列"(associative arrays),陣列的索引可以是數字或者是字串。在 Lua 裡,table 的建立是通過"構造表示式"來完成,最簡單構造表示式是{},用來建立一個空表

1、nil(空)

nil 型別表示一種沒有任何有效值,它只有一個值 -- nil,例如列印一個沒有賦值的變數,便會輸出一個 nil 值:

print(type(a)) nil

對於全域性變數和 table,nil 還有一個"刪除"作用,給全域性變數或者 table 表裡的變數賦一個 nil 值,等同於把它們刪掉

2、boolean(布林)

boolean 型別只有兩個可選值:true(真) 和 false(假),Lua 把 false 和 nil 看作是"假",其他的都為"真"

3、number(數字)

Lua 預設只有一種 number 型別 -- double(雙精度)型別

4、string(字串)

字串由一對雙引號或單引號來表示。 也可以用 2 個方括號 "[[]]" 來表示"一塊"字串。

(1)在對一個數字字串上進行算術操作時,Lua 會嘗試將這個數字字串轉成一個數字:

> print("2" + 6)
輸出:8.0
> print("2" + "6")
輸出:8.0
> print("2 + 6")
輸出:2 + 6
複製程式碼

(2)字串連線使用的是 .. ,如:

> print("a" .. 'b')
輸出:ab
複製程式碼

(3)使用 # 來計算字串的長度,放在字串前面,如下例項:

> len = "www.w3cschool.cn"
> print(#len)
輸出:16
複製程式碼

5、table(表)

在 Lua 裡,table 的建立是通過"構造表示式"來完成,最簡單構造表示式是{},用來建立一個空表。也可以在表裡新增一些資料,直接初始化表;

  • (1)Lua 中的表(table)其實是一個"關聯陣列"(associative arrays),陣列的索引可以是數字或者是字串。
  • (2)不同於其他語言的陣列把 0 作為陣列的初始索引,在 Lua 裡表的預設初始索引一般以 1 開始。
  • (3)table 不會固定長度大小,有新資料新增時 table 長度會自動增長,沒初始的 table 都是 nil。

6、function(函式)

在 Lua 中,函式是被看作是"第一類值(First-Class Value)",函式可以存在變數裡;

function factorial1(n)

print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))
function 可以以匿名函式(anonymous function)的方式通過引數傳遞:
function anonymous(tab, fun)

anonymous(tab, function(key, val)
    return key .. " = " .. val
end)
複製程式碼

7、thread(執行緒)

在 Lua 裡,最主要的執行緒是協同程式(coroutine)。它跟執行緒(thread)差不多,擁有自己獨立的棧、區域性變數和指令指標,可以跟其他協同程式共享全域性變數和其他大部分東西。

執行緒跟協程的區別:執行緒可以同時多個執行,而協程任意時刻只能執行一個,並且處於執行狀態的協程只有被掛起(suspend)時才會暫停。

8、userdata(自定義型別)

userdata 是一種使用者自定義資料,用於表示一種由應用程式或 C/C++ 語言庫所建立的型別,可以將任意 C/C++ 的任意資料型別的資料(通常是 struct 和 指標)儲存到 Lua 變數中呼叫。

三、Lua 變數 變數在使用前,必須在程式碼中進行宣告,即建立該變數。編譯程式執行程式碼之前編譯器需要知道如何給語句變數開闢儲存區,用於儲存變數的值。 Lua 變數有三種型別:全域性變數、區域性變數、表中的域。 函式外的變數預設為全域性變數,除非用 local 顯示宣告。函式內變數與函式的引數預設為區域性變數。變數的預設值均為 nil。

賦值語句 (1)Lua可以對多個變數同時賦值,變數列表和值列表的各個元素用逗號分開,賦值語句右邊的值會依次賦給左邊的變數。

a, b = 10, 2*x       <-等價於->       a=10; b=2*x
複製程式碼

(2)遇到賦值語句Lua會先計算右邊所有的值然後再執行賦值操作,所以我們可以這樣進行交換變數的值:

x, y = y, x                     -- swap 'x' for 'y'
複製程式碼

(3)當變數個數和值的個數不一致時,Lua會一直以變數個數為基礎採取以下策略:

  • a. 變數個數 > 值的個數 按變數個數補足nil
  • b. 變數個數 < 值的個數 多餘的值會被忽略

#### YunSoul技術分享,掃碼關注微信公眾號##
    ——只要你學會了之前所不會的東西,只要今天的你強過了昨天的你,那你就一直是在進階的路上了。 1、Lua 基礎