亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > 綜合 > 正文

Lua教程(二):基礎(chǔ)知識、類型與值介紹

2024-07-21 23:04:43
字體:
供稿:網(wǎng)友

一、基礎(chǔ)知識:

1. 第一個程序和函數(shù):
    在目前這個學習階段,運行Lua程序最好的方式就是通過Lua自帶的解釋器程序,如:
 

復(fù)制代碼 代碼如下:

    /> lua
    > print("Hello World")
    Hello World
 

    這樣我們就可以以交互性的方式輸入lua代碼,并立即得到執(zhí)行結(jié)果了。對于代碼塊較少的測試程序來說,這種方式確實是非常方便的,然而對于相對復(fù)雜的程序而言,這種方式就不是很合適了。如果是這樣,我們可以將Lua代碼保存到一個獨立的Lua程序文件中,之后再通過Lua解釋器程序以命令行參數(shù)的形式執(zhí)行文件中的Lua代碼。如我們將下面的Lua代碼保存到test.lua的文件中:

 

 

復(fù)制代碼 代碼如下:

function fact(n)
    if n == 0 then
        return 1
    else
        return n * fact(n - 1)
    end
end
print("Enter a number:")
a = io.read("*number")
print(fact(a))

 

 

復(fù)制代碼 代碼如下:

/> lua D:/test.lua
    Enter a number:
    4
    24

 

2. 代碼規(guī)范:

    1). Lua的多條語句之間并不要求任何分隔符,如C語言的分號(;),其中換行符也同樣不能起到語句分隔的作用。因此下面的寫法均是合法的。如:
 

復(fù)制代碼 代碼如下:

 a = 1
b = a * 2
   
a = 1;
b = a * 2;
   
a = 1; b = a * 2;
a = 1  b = a * 2
 

    2). 通過dofile()方法引用其他Lua文件中的函數(shù),如:

 

 

復(fù)制代碼 代碼如下:

function fact(n)
    if n == 0 then
        return 1
    else
        return n * fact(n - 1)
    end
end

 

將上面的函數(shù)保存到test2.lua文件中。

復(fù)制代碼 代碼如下:

    /> lua
    > dofile("d:/test2.lua")
    > print(fact(4))
    24

    3). 詞法規(guī)范。
    和大多數(shù)其它語言一樣,在聲明變量時,變量名可以由任意字母、數(shù)字和下劃線構(gòu)成,但是不能以數(shù)字開頭。在Lua中還有一個特殊的規(guī)則,即以下劃線(_)開頭,后面緊隨多個大寫字母(_VERSION),這些變量一般被Lua保留并用于特殊用途,因此我們在聲明變量時需要盡量避免這樣的聲明方式,以免給后期的維護帶來不必要的麻煩。
    Lua是大小寫敏感的,因此對于一些Lua保留關(guān)鍵字的使用要特別小心,如and。但是And和AND則不是Lua的保留字。
    4). Lua中的注釋分為兩種,一種是單行注釋,如:
 
復(fù)制代碼 代碼如下:

    --This is a single line comment.
    另外一種是多行注釋,如:
    --[[
    This is a multi-lines comment.
    --]]

    3. 全局變量:
    在Lua中全局變量不需要聲明,直接賦值即可。如果直接訪問未初始化的全局變量,Lua也不會報錯,直接返回nil。如果不想再使用該全局變量,可直接將其置為nil。如:
 
復(fù)制代碼 代碼如下:

    /> lua
    > print(b)
    nil
    > b = 10
    > print(b)
    10
    > b = nil
    > print(b)
    nil
   

    4. 解釋器程序:
    命令行用法如下:
    lua [options] [lua-script [arguments] ]
    該工具的命令行選項主要有以下3個:
    -e: 可以直接執(zhí)行命令行中Lua代碼,如:lua -e "print(/"Hello World/")"
    -l: 加載該選項后的Lua庫文件,如:lua -l mylib -e "x = 10",該命令在執(zhí)行之前先將mylib中的Lua代碼加載到內(nèi)存中,在后面的命令中就可以直接使用該文件中定義的Lua函數(shù)了。
    -i: 在執(zhí)行完指定的Lua程序文件之后,并不退出解釋器程序,而是直接進入該程序的交互模式。   
    在解釋器程序的交互模式下,我們可以通過在表達式前加等號(=)標識符的方式直接輸出表達式的執(zhí)行結(jié)果。通過該方式,我們可以將該程序用于計算器,如:
   
復(fù)制代碼 代碼如下:

 /> lua
    > = 3 + 1 + 4
    8
 

    該小節(jié)最后需要介紹的是lua腳本的命令行參數(shù)訪問規(guī)則。如:
 
復(fù)制代碼 代碼如下:

    /> lua lua-script.lua a b c
 

    在該腳本的程序入口,lua解釋器會將所有命令行參數(shù)創(chuàng)建一個名為arg的table。其中腳本名(lua-script.lua)位于table索引的0位置上。它的第一個參數(shù)(a)則位于索引1,其它的參數(shù)以此類推。這種索引方式和C語言中讀取命令行參數(shù)的規(guī)則相同。但是不同的是,Lua提供了負數(shù)索引,用以訪問腳本名稱之前的命令行參數(shù),如:
 
復(fù)制代碼 代碼如下:

    arg[-1] = lua
    arg[0] = lua-script.lua
    arg[1] = a
    arg[2] = b
    arg[3] = c

 

二、類型與值:

    Lua是一種動態(tài)類型的語言。其語言本身沒有提供類型定義的語法,每個值都“攜帶”了它自身的類型信息。在Lua中有8中基礎(chǔ)類型,分別是:nil、boolean、number、string、userdata、function、thread和table。我們可以通過type函數(shù)獲得變量的類型信息,該類型信息將以字符串的形式返回。如:
 

復(fù)制代碼 代碼如下:

    > print(type("hello world"))
    string
    > print(type(10.4))
    number
    > print(type(print))
    function
    > print(type(true))
    boolean
    > print(type(nil))
    nil
    > print(type(type(X)))
    string

    1. nil(空):
    nil是一種類型,它只有一個值nil,它的主要功能是由于區(qū)別其他任何值。就像之前所說的,一個全局變量在第一次賦值前的默認值的默認值就是nil,將nil賦予一個全局變量等同于刪除它。Lua將nil用于表示一種“無效值”的情況。
    
    2. boolean(布爾):
    該類型有兩個可選值:false和true。在Lua中只有當值是false和nil時才視為“假”,其它值均視為真,如數(shù)字零和空字符串,這一點和C語言是不同的。
    
    3. number(數(shù)字):
    Lua中的number用于表示實數(shù)。Lua中沒有專門的類型表示整數(shù)。
    
    4. string(字符串):
    Lua中的字符串通常表示“一個字符序列”。字符串類型的變量是不可變的,因此不能像C語言中那樣直接修改字符串的某一個字符,而是在修改的同時創(chuàng)建了新的字符串。如:
復(fù)制代碼 代碼如下:

1 a = "one string"
2 b = string.gsub(a,"one","another")
3 print(a)
4 print(b)
    /> lua d:/test.lua   
    one string
    anotner string
 

    Lua支持和C語言類似的字符轉(zhuǎn)義序列,見下表:

 

Lua,教程,基礎(chǔ)知識,類型,值

在Lua中還可以通過[[ all strings ]]的方式來禁用[[ ]]中轉(zhuǎn)義字符,如:
    page = [[ <html> <head> <title> An Html Page </title> </head> ]]
    如果兩個方括號中包含這樣的內(nèi)容:a = b[c[i]],這樣將會導(dǎo)致Lua的誤解析,因此在這種情況下,我們可以將其改為[===[ 和 ]===]的形式,從而避免了誤解析的發(fā)生。
    Lua提供了運行時的數(shù)字與字符串的自動轉(zhuǎn)換。如:
 

復(fù)制代碼 代碼如下:

    > print("10" + 1)
    11
    > print("10 + 1")
    10 + 1
 

    如果在實際編程中,不希望兩個數(shù)字字符串被自動轉(zhuǎn)換,而是實現(xiàn)字符串之間的連接,可以通過" .. "操作符來完成。如:
 
復(fù)制代碼 代碼如下:

    > print(10 .. 20)
    1020
 

    注意..和兩邊的數(shù)字之間必須留有空格,否則就會被Lua誤解析為小數(shù)點兒。
    盡管Lua提供了這種自動轉(zhuǎn)換的功能,為了避免一些不可預(yù)測的行為發(fā)生,特別是因為Lua版本升級而導(dǎo)致的行為不一致現(xiàn)象。鑒于此,還是應(yīng)該盡可能使用顯示的轉(zhuǎn)換,如字符串轉(zhuǎn)數(shù)字的函數(shù)tonumber(),或者是數(shù)字轉(zhuǎn)字符串的函數(shù)tostring()。對于前者,如果函數(shù)參數(shù)不能轉(zhuǎn)換為數(shù)字,該函數(shù)返回nil。如:
復(fù)制代碼 代碼如下:

line = io.read()
n = tonumber(line)
if n == nil then
    error(line .. " is not a valid number")
else
    print(n * 2)
end

 

關(guān)于Lua的字符串最后需要介紹的是"#"標識符,該標識符在字符串變量的前面將返回其后字符串的長度,如:

復(fù)制代碼 代碼如下:

1 a = "hello"
2 print(#a)
    /> lua d:/test.lua
    5
        
    5. table(表):

 

    我們可以將Lua中table類型視為“關(guān)聯(lián)數(shù)組”,如C++標準庫中的map,差別是Lua中table的鍵(key)可以為任意類型(nil除外),而map中的鍵只能為模參類型。此外,table沒有固定的大小,可以動態(tài)的添加任意數(shù)量的元素到一個table中。table是Lua中最主要數(shù)據(jù)結(jié)構(gòu),其功能非常強大,可用于實現(xiàn)數(shù)組、集合、記錄和隊列數(shù)據(jù)結(jié)構(gòu)。以下為table的變量聲明,以及關(guān)聯(lián)數(shù)據(jù)的初始化方式:

復(fù)制代碼 代碼如下:

a = {}              -- 創(chuàng)建一個table對象,并將它的引用存儲到a
k = "x"
a[k] = 10           -- 創(chuàng)建了新條目,key = "x", value = 10
a[20] = "great"     -- 新條目,key = 20, value = "great"
print(a["x"])
k = 20
print(a[k])         -- 打印great
a["x"] = a["x"] + 1
print(a["x"])       -- 打印11

 

    所有的table都可以用不同類型的索引來訪問value,當需要容納新條目時,table會自動增長。

復(fù)制代碼 代碼如下:

a = {}
for i = 1, 100 do
    a[i] = i * 2
end
print(a[9])
a["x"] = 10
print(a["x"])
print(a["y"])      --table中的變量和全局變量一樣,沒有賦值之前均為nil。

 

--輸出結(jié)果為
--18
--10
--nil

 

   在Lua中還提供了另外一種方法用于訪問table中的值,見如下示例:

復(fù)制代碼 代碼如下:

a.x = 10      --等同于a["x"] = 10
print(a.x)    --等同于print(a["x"])
print(a.y)    --等同于print(a["y"])

    對于Lua來說,這兩種方式是等價的。但是對于開發(fā)者而言,點的寫法隱式的將table表示為記錄,既C語言中的結(jié)構(gòu)體。而之前講述的字符串表示法則意味著任何字符串均可作為table的key。
    如果需要將table表示為傳統(tǒng)的數(shù)組,只需將整數(shù)作為table的key即可。如:
復(fù)制代碼 代碼如下:

a = {}
for i = 1,10 do
    a[i] = i * 2
end

 

for i = 1,10 do
    print(a[i])
end


    在Lua中,我通常習慣以1作為數(shù)組索引的起始值。而且還有不少內(nèi)部機制依賴于這個慣例。如:
復(fù)制代碼 代碼如下:

a = {}
for i = 1,10 do
    a[i] = i * 2
end

 

for i = 1,#a do
    print(a[i])
end

 

由于數(shù)組實際上仍為一個table,所以對于數(shù)組大小的計算需要留意某些特殊的場景,如:

復(fù)制代碼 代碼如下:

    a = {}
    a[1000] = 1

    在上面的示例中,數(shù)組a中索引值為1--999的元素的值均為nil。而Lua則將nil作為界定數(shù)據(jù)結(jié)尾的標志。當一個數(shù)組含有“空隙”時,即中間含有nil值,長度操作符#會認為這些nil元素就是結(jié)尾標志。當然這肯定不是我們想要的結(jié)果。因此對于這些含有“空隙”的數(shù)組,我們可以通過函數(shù)table.maxn()返回table的最大正數(shù)索引值。如:
復(fù)制代碼 代碼如下:

a = {}
a[1000] = 1
print(table.maxn(a))   
 
-- 輸出1000

    6. function(函數(shù)):
    在Lua中,函數(shù)可以存儲在變量中,可以通過參數(shù)傳遞其它函數(shù),還可以作為其它函數(shù)的返回值。這種特性使語言具有了極大的靈活性。

 

    7. userdata(自定義類型):
    由于userdata類型可以將任意C語言數(shù)據(jù)存儲到Lua變量中。在Lua中,這種類型沒有太多預(yù)定義的操作,只能進行賦值和相等性測試。userdata用于表示一種由應(yīng)用程序或C語言庫所創(chuàng)建的新類型。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
久久网站最新地址| 亚洲精品国产精品乱码不99按摩| 内射无码专区久久亚洲| 欧美精品免费视频| 国产精品特级毛片一区二区三区| 99精品桃花视频在线观看| 欧美性受xxxx黑人猛交| 欧美专区日韩视频| 日韩亚洲欧美在线观看| 日韩精品免费一区二区在线观看| 亚洲精品成人久久久| 中文字幕乱码在线| 欧美国产日韩免费| 可以在线看的黄色网址| 国产永久在线观看| 国产精伦一区二区三区| 精品日韩美女的视频高清| 神马久久精品| 欧美一级视频精品观看| 精品久久99ma| 免费一级淫片| 69**夜色精品国产69乱| 亚洲高清国产精品| 欧美激情视频三区| 日韩免费视频一区二区视频在线观看| 激情亚洲一区二区三区四区| 91干在线观看| 九九久久免费视频| 亚洲一区二区三区四区在线| 欧美性猛交xxxx乱大交退制版| 天天色综合av| 成年人看的羞羞网站| 在线视频观看一区二区| 嫩草影院2018| 亚洲午夜激情影院| 成人h小游戏| 中文字幕在线观看视频网站| 中文字幕无线码一区| 男女污视频在线观看| 久久久久久穴| 日韩免费一区二区| 精品人妻中文无码av在线| 88在线观看91蜜桃国自产| 1000部精品久久久久久久久| 在线中文字幕资源| 中文字幕第一区第二区| 亚洲欧美日韩综合在线| 日韩中文字幕在线| 九九热视频在线免费观看| 亚洲精品一二三四区| 亚洲性感美女99在线| 电影eeuss影院www| 日韩午夜在线观看| 99久久免费国产精品| 免费一级a毛片| 国产另类xxxxhd高清| 国产对白叫床清晰在线播放| а天堂8中文最新版在线官网| 美女100%一区| √最新版天堂资源网在线| 国产一级做a爰片在线看免费| 99热国产免费| 久热精品在线观看| 精品国产亚洲一区二区在线观看| 欧美先锋影音| 78精品国产综合久久香蕉| 欧美在线你懂得| 希岛爱理av一区二区三区| 美女久久久久久久久| 日精品一区二区| 精品人妻一区二区三区麻豆91| 久草久草久草| 一本色道久久综合亚洲精品高清| 日韩国产精品91| 国产亚洲美州欧州综合国| 日本精品在线视频| 青青一区二区| 我要看一级黄色录像| 午夜精品久久久久久久99老熟妇| 日韩一级大片在线观看| 91精品国产91久久久久久| 欧美性一级生活| 欧美又黄又嫩大片a级| 国产精品综合二区| 视频二区不卡| 色综合天天综合在线视频| 精品日本一线二线三线不卡| 亚洲综合精品四区| 欧美日韩亚洲国产综合| av在线电影网站| 91极品尤物在线播放国产| 亚洲欧洲日本一区二区三区| 国产av无码专区亚洲av麻豆| 国产精品成人久久电影| 欧美变态挠脚心| 无码人妻精品一区二区三区9厂| 日韩中文字幕一区| 中文字幕中文在线| 1769在线观看| 国产一区二区电影在线观看| a天堂中文在线官网| 亚洲无线视频| 国产精品xxx在线观看www| 日韩电影在线看| 欧美日韩免费在线观看| 色yeye香蕉凹凸一区二区av| porn视频在线观看| 视频在线亚洲| 老牛影视av老牛影视av| 在线观看免费国产成人软件| 欧美亚洲视频一区二区| 五月天av网站| 欧美日韩在线影院| 两个人hd高清在线观看| 日韩久久久久久久| 久草在线资源视频在线观看| 亚洲视频在线观看一区二区| 亚洲精品动漫久久久久| 实拍女处破www免费看| 国产三级在线免费观看| 国产福利一区二区三区视频| 无码aⅴ精品一区二区三区| 久久黄色精品视频| 亚洲国产一区二区三区高清| 天天综合网天天| 精品午夜福利视频| 色伦专区97中文字幕| 亚洲人成电影在在线观看网色| 日韩av电影在线播放| 欧美在线观看视频一区二区三区| 国产无遮挡又黄又爽又色视频| 亚洲a一区二区| 中文字幕一区二区三区四区久久| 亚州综合一区| 91麻豆国产福利精品| 在线免费观看污| 日本一区二区三区在线不卡| 欧美一区日本一区韩国一区| 国产精品免费看久久久无码| 亚洲第一网站在线观看| 中文字幕 日本| 亚洲高清免费一级二级三级| 国产欧美精品一区二区| 天天干天天草天天| 久久丁香综合五月国产三级网站| 亚洲午夜精品久久久久久人妖| 国产精品成人无码免费| 亚洲91精品在线观看| 日韩一卡二卡三卡国产欧美| 伊人国产在线视频| 亚州国产精品久久久| 精品国产乱码久久久久久影片| 日本韩国欧美一区| 国产日韩精品综合网站| 香港三级经典全部种子下载| xxxx另类黑人| 午夜日韩电影| 色婷婷激情久久| 一个人看的www视频免费观看| 免费一级做a爰片久久毛片潮| 国产欧美一区二区三区在线看蜜臂| 自拍偷拍一区| 欧美精品99久久久**| 日本wwwwwww| 欧美成人免费观看视频| 国产一区二区三区电影在线观看| 欧美福利小视频| 欧美mv日韩mv国产| 亚洲天堂男人| 欧美野外性xxxxfeexxxx| 5566中文字幕一区二区| 内射国产内射夫妻免费频道| 黑人极品videos精品欧美裸| 国产亚洲短视频| 91视频99| 亚洲欧美一区二区久久| 亚洲精品视频大全| 强迫凌虐淫辱の牝奴在线观看| 欧美人与性动xxxx| 老司机福利在线观看| 手机看片日韩| 四虎成人在线视频| 97在线视频观看| 粉嫩av一区二区| www.51色.com| 久久综合九色综合久久久精品综合| 日本一区二区三区在线视频| 欧美婷婷精品激情| 最近2019中文字幕一页二页| 国产美女扒开尿口久久久| 欧美亚洲成人免费| 亚洲精品推荐| 久久久久成人精品无码中文字幕| 久久精品国产亚洲av无码娇色| 国产视频一区二区三区在线观看| 久久久久久久久久久久久久av| 亚洲欧美日韩成人网| 国产欧美日韩一区二区三区在线| 97婷婷涩涩精品一区| 午夜精品一区二| 欧美一级生活片| 亚州精品永久观看视频| 国产精品久久久久久亚洲毛片| 精品欧美一区二区三区精品久久| yes4444视频在线观看| 成年人视频网站在线| 在线免费观看日本欧美| 在线观看网站免费入口在线观看国内| 91午夜在线观看| 日韩中文在线观看| 国产亚洲一区二区三区不卡| 亚洲精品网站在线观看| 992tv国产精品成人影院| 亚洲精品一区中文字幕电影| 最新国产露脸在线观看| 精品入口蜜桃| 在线视频观看一区二区| av在线电影播放| 午夜电影一区二区三区| 亚洲国模精品私拍| 国产成人a亚洲精品| 亚洲中文字幕在线观看| 国产三级三级在线观看| 日韩视频免费观看高清完整版| 日韩欧美在线看| 日韩一区欧美一区| 欧美成欧美va| 国产精品一区专区| 日韩88av| 亚洲国产精品一区二区久久恐怖片| 欧美日韩在线播放视频| 国产精品中文久久久久久| 日韩一区二区三区不卡视频| 97精品电影院| 国产ts丝袜人妖系列视频| 欧美亚洲自偷自偷| 日韩午夜三级在线| 色综合色综合色综合色综合色综合| 国产精品一区三区| 男男视频亚洲欧美| av小说在线| 日韩在线观看一区二区| www.亚洲成人| 色综合www| 24小时免费看片在线观看| 极品销魂一区二区三区| 给我免费播放日韩视频| 91精品久久久久久蜜桃| 日本黄色三级视频| 久久大胆人体| 丰满大乳奶做爰ⅹxx视频| 国产精品一区二区免费在线观看| 午夜午夜精品一区二区三区文| 尤物在线观看一区| 久久99国产精品久久99果冻传媒| 尤物视频在线观看网站| 大荫蒂欧美视频另类xxxx| 精品久久ai电影| 无遮挡动作视频在线观看免费入口| 亚洲欧洲成人自拍| 亚洲网站在线免费观看| 69av在线| 性欧美freehd18| av影片在线看| 动漫h在线观看| 最新天堂资源在线| 自拍自偷一区二区三区| 荡女精品导航| 久操视频在线免费观看| 亚洲综合在线小说| 污视频免费在线观看| av在线小说| 蜜臀av在线播放| 久久久99精品久久| 亚洲综合视频| 日韩av日韩在线观看| 久久久久久久一区二区三区| 成人女人a毛片在线看| 欧美老女人性生活视频| 天堂中文在线观看视频| 不卡视频一区二区| 欧美日韩在线观看一区| 国产亚洲欧洲一区高清在线观看| 亚洲欧洲在线一区| 成人综合网站| 精品国产精品一区二区夜夜嗨| 91蜜桃婷婷狠狠久久综合9色| 日本乱码高清不卡字幕| 欧美午夜影院一区| 高清美女视频一区| 老司机精品在线| 一区二区三区精品99久久| 正在播放欧美视频| 国产成人午夜精品| 91网址在线播放| 精品日韩久久久| 人人影院免费大片| 国产午夜精品久久久| 国产区视频在线观看| 午夜写真片福利电影网| 欧美小视频在线观看| 日韩精品视频久久| 成人a在线观看| 久色婷婷小香蕉久久| 116美女写真午夜一级久久| 欧美二区在线播放| 国精产品一区二区| 99久久亚洲| 欧美大片aaa| 国产永久在线观看| 精品一区二区三区视频日产| 国语对白做受69按摩| 欧美一级大片| 麻豆国产原创| 黑人操亚洲人| 国产亚洲美女精品久久久| 羞羞视频立即看| 日本高清www| 国产亚洲欧美在线视频| 日本中文字幕影院| 欧美深性狂猛ⅹxxx深喉| 亚洲天堂成人在线观看| 色欧美自拍视频| dy888夜精品国产专区| 久草影视在线| 午夜精品国产| 中文字幕一精品亚洲无线一区| 国内欧美视频一区二区|