lua的數據類型

Lua 是動態(弱)類型的語言,它有一下幾種數據結構:html

 

nil(空)數組

nil 類型表示一種沒有任何有效值,它只有一個值 -- nil,例如打印一個沒有賦值的變量,便會輸出一個 nil 值:數據結構

print(type(a))app

 

對於全局變量和 table,nil 還有一個「刪除」做用,給全局變量或者 table 表裏的變量賦一個 nil 值,等同於把它們刪掉,執行下面代碼就知:函數

tab1 = { key1 = "val1", key2 = "val2", "val3" }this

for k, v in pairs(tab1) dolua

    print(k .. " - " .. v).net

end線程

 

tab1.key1 = nil指針

for k, v in pairs(tab1) do

    print(k .. " - " .. v)

end

 

boolean(布爾)

boolean 類型只有兩個可選值:true(真) 和 false(假),Lua 把 false 和 nil 看做是「假」,其餘的都爲「真」

 

print(type(true))

print(type(false))

print(type(nil))

 

if type(false) or type(nil) then

    print("false and nil are false!")

else

    print("other is true!")

end

 

number(數字)

Lua 默認只有一種 number 類型 -- double(雙精度)類型(默認類型能夠修改 luaconf.h 裏的定義),如下幾種寫法都被看做是 number 類型:

print(type(2))

print(type(2.2))

print(type(0.2))

print(type(2e+1))

print(type(0.2e-1))

print(type(7.8263692594256e-06))

 

string(字符串)

字符串由一對雙引號或單引號來表示

string1 = "this is string1"

string2 = 'this is string2'

 

也能夠用 2 個方括號 "[[]]" 來表示「一塊」字符串

html = [[

<html>

<head></head>

<body>

    <a href="http://jb51.net/">just a link</a>

</body>

</html>

]]

print(html)

 

在對一個數字字符串上進行算術操做時,Lua 會嘗試將這個數字字符串轉成一個數字

print("2" + 6)

print("2" + "6")

print("2 + 6")

print("-2e2" * "6")

print("error" + 1)

 

使用 .. 鏈接字符串

print("a" .. 'b')

print(157 .. 428)

 

使用 # 做爲長度操做符,放在字符串前面能夠獲取該字符串的長度

len = "length"

print(#len)

print(#"length")

 

table(表)

在 Lua 裏,table 的建立是經過「構造表達式」來完成,最簡單構造表達式是{},用來建立一個空表。也能夠在表裏添加一些數據,直接初始化表:

 

-- 建立一個空的 table

local tbl1 = {}

 

-- 直接初始表

local tbl2 = {"apple", "pear", "orange", "grape"}

 

Lua 中的表(table)實際上是一個「關聯數組」(associative arrays),數組的索引能夠是數字或者是字符串

a = {}

a["key"] = "value"

key = 10

a[key] = 22

a[key] = a[key] + 11

for k, v in pairs(a) do

    print(k .. " : " .. v)

end

 

不一樣於其餘語言的數組把 0 做爲數組的初始索引,在 Lua 裏表的默認初始索引通常以 1 開始

local tbl = {"apple", "pear", "orange", "grape"}

for key, val in pairs(tbl) do

    print("Key", key)

end

 

table 的變量只是一個地址引用,對 table 的操做不會產生 table 的副本或建立新的 table

a1 = {}

a1["key"] = "val1"

a2 = a1

print(a2["key"])

a2["key"] = "val2"

print(a1["key"])

print(a1.key)

 

table 不會固定長度大小,有新數據添加時 table 長度會自動增加,沒初始的 table 都是 nil

a3 = {}

for i = 1, 10 do

    a3[i] = i

end

a3["key"] = "val"

print(a3["key"])

print(a3["none"])

 

function(函數)

在 Lua 中,函數是被看做是「第一類值(First-Class Value)」,函數能夠存在變量裏

function factorial1(n)

    if n == 0 then

        return 1

    else

        return n * factorial1(n - 1)

    end

end

print(factorial1(5))

factorial2 = factorial1

print(factorial2(5))

 

function 能夠以匿名函數(anonymous function)的方式經過參數傳遞

function anonymous(tab, fun)

    for k, v in pairs(tab) do

        print(fun(k, v))

    end

end

tab = { key1 = "val1", key2 = "val2" }

anonymous(tab, function(key, val)

    return key .. " = " .. val

end)

 

thread(線程)

在 Lua 裏,最主要的線程是協同程序(coroutine)。它跟線程(thread)差很少,擁有本身獨立的棧、局部變量和指令指針,能夠跟其餘協同程序共享全局變量和其餘大部分東西。

 

線程跟協程的區別:線程能夠同時多個運行,而協程任意時刻只能運行一個,而且處於運行狀態的協程只有被掛起(suspend)時纔會暫停。

 

userdata(自定義類型)

userdata 是一種用戶自定義數據,用於表示一種由應用程序或 C/C++ 語言庫所建立的類型,能夠將任意 C/C++ 的任意數據類型的數據(一般是 struct 和 指針)存儲到 Lua 變量中調用。

相關文章
相關標籤/搜索