激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Lua - Lua教程(二):基礎(chǔ)知識(shí)、類型與值介紹

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

2020-04-28 10:22腳本之家 Lua

這篇文章主要介紹了Lua教程(二):基礎(chǔ)知識(shí)、類型與值介紹,本文講解了Hello World程序、代碼規(guī)范、全局變量、類型與值等內(nèi)容,需要的朋友可以參考下

一、基礎(chǔ)知識(shí):

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

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

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


    這樣我們就可以以交互性的方式輸入lua代碼,并立即得到執(zhí)行結(jié)果了。對(duì)于代碼塊較少的測(cè)試程序來(lái)說(shuō),這種方式確實(shí)是非常方便的,然而對(duì)于相對(duì)復(fù)雜的程序而言,這種方式就不是很合適了。如果是這樣,我們可以將Lua代碼保存到一個(gè)獨(dú)立的Lua程序文件中,之后再通過(guò)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的多條語(yǔ)句之間并不要求任何分隔符,如C語(yǔ)言的分號(hào)(;),其中換行符也同樣不能起到語(yǔ)句分隔的作用。因此下面的寫法均是合法的。如:
 

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

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


    2). 通過(guò)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ù)其它語(yǔ)言一樣,在聲明變量時(shí),變量名可以由任意字母、數(shù)字和下劃線構(gòu)成,但是不能以數(shù)字開頭。在Lua中還有一個(gè)特殊的規(guī)則,即以下劃線(_)開頭,后面緊隨多個(gè)大寫字母(_VERSION),這些變量一般被Lua保留并用于特殊用途,因此我們?cè)诼暶髯兞繒r(shí)需要盡量避免這樣的聲明方式,以免給后期的維護(hù)帶來(lái)不必要的麻煩。
    Lua是大小寫敏感的,因此對(duì)于一些Lua保留關(guān)鍵字的使用要特別小心,如and。但是And和AND則不是Lua的保留字。
    4). Lua中的注釋分為兩種,一種是單行注釋,如:
 

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

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


    3. 全局變量:
    在Lua中全局變量不需要聲明,直接賦值即可。如果直接訪問(wèn)未初始化的全局變量,Lua也不會(huì)報(bào)錯(cuò),直接返回nil。如果不想再使用該全局變量,可直接將其置為nil。如:
 

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

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


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

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

 /> lua
    > = 3 + 1 + 4
    8


    該小節(jié)最后需要介紹的是lua腳本的命令行參數(shù)訪問(wèn)規(guī)則。如:
 

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

    /> lua lua-script.lua a b c


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

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

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

 

二、類型與值:

    Lua是一種動(dòng)態(tài)類型的語(yǔ)言。其語(yǔ)言本身沒(méi)有提供類型定義的語(yǔ)法,每個(gè)值都“攜帶”了它自身的類型信息。在Lua中有8中基礎(chǔ)類型,分別是:nil、boolean、number、string、userdata、function、thread和table。我們可以通過(guò)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是一種類型,它只有一個(gè)值nil,它的主要功能是由于區(qū)別其他任何值。就像之前所說(shuō)的,一個(gè)全局變量在第一次賦值前的默認(rèn)值的默認(rèn)值就是nil,將nil賦予一個(gè)全局變量等同于刪除它。Lua將nil用于表示一種“無(wú)效值”的情況。
    
    2. boolean(布爾):
    該類型有兩個(gè)可選值:false和true。在Lua中只有當(dāng)值是false和nil時(shí)才視為“假”,其它值均視為真,如數(shù)字零和空字符串,這一點(diǎn)和C語(yǔ)言是不同的。
    
    3. number(數(shù)字):
    Lua中的number用于表示實(shí)數(shù)。Lua中沒(méi)有專門的類型表示整數(shù)。
    
    4. string(字符串):
    Lua中的字符串通常表示“一個(gè)字符序列”。字符串類型的變量是不可變的,因此不能像C語(yǔ)言中那樣直接修改字符串的某一個(gè)字符,而是在修改的同時(shí)創(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語(yǔ)言類似的字符轉(zhuǎn)義序列,見(jiàn)下表:

 

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

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

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

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


    如果在實(shí)際編程中,不希望兩個(gè)數(shù)字字符串被自動(dòng)轉(zhuǎn)換,而是實(shí)現(xiàn)字符串之間的連接,可以通過(guò)" .. "操作符來(lái)完成。如:
 

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

    > print(10 .. 20)
    1020


    注意..和兩邊的數(shù)字之間必須留有空格,否則就會(huì)被Lua誤解析為小數(shù)點(diǎn)兒。
    盡管Lua提供了這種自動(dòng)轉(zhuǎn)換的功能,為了避免一些不可預(yù)測(cè)的行為發(fā)生,特別是因?yàn)長(zhǎng)ua版本升級(jí)而導(dǎo)致的行為不一致現(xiàn)象。鑒于此,還是應(yīng)該盡可能使用顯示的轉(zhuǎn)換,如字符串轉(zhuǎn)數(shù)字的函數(shù)tonumber(),或者是數(shù)字轉(zhuǎn)字符串的函數(shù)tostring()。對(duì)于前者,如果函數(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的字符串最后需要介紹的是"#"標(biāo)識(shí)符,該標(biāo)識(shí)符在字符串變量的前面將返回其后字符串的長(zhǎng)度,如:

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

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

        
    5. table(表):

 

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

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

a = {}              -- 創(chuàng)建一個(gè)table對(duì)象,并將它的引用存儲(chǔ)到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都可以用不同類型的索引來(lái)訪問(wèn)value,當(dāng)需要容納新條目時(shí),table會(huì)自動(dòng)增長(zhǎng)。

復(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中的變量和全局變量一樣,沒(méi)有賦值之前均為nil。

 

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

 

   在Lua中還提供了另外一種方法用于訪問(wèn)table中的值,見(jiàn)如下示例:

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

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


    對(duì)于Lua來(lái)說(shuō),這兩種方式是等價(jià)的。但是對(duì)于開發(fā)者而言,點(diǎn)的寫法隱式的將table表示為記錄,既C語(yǔ)言中的結(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中,我通常習(xí)慣以1作為數(shù)組索引的起始值。而且還有不少內(nèi)部機(jī)制依賴于這個(gè)慣例。如:

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


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

 

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

 

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

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

    a = {}
    a[1000] = 1


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

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

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


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

 

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

延伸 · 閱讀

精彩推薦
  • LuaLua教程(二):基礎(chǔ)知識(shí)、類型與值介紹

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

    這篇文章主要介紹了Lua教程(二):基礎(chǔ)知識(shí)、類型與值介紹,本文講解了Hello World程序、代碼規(guī)范、全局變量、類型與值等內(nèi)容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
  • LuaLua實(shí)現(xiàn)__add方法重載示例

    Lua實(shí)現(xiàn)__add方法重載示例

    這篇文章主要介紹了Lua實(shí)現(xiàn)__add方法重載示例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
  • Lua深入探究Lua中的解析表達(dá)式

    深入探究Lua中的解析表達(dá)式

    這篇文章主要介紹了深入探究Lua中的解析表達(dá)式,對(duì)于其語(yǔ)法部分的說(shuō)明和示例都超詳細(xì),極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監(jiān)控賦值、通過(guò)table給另一個(gè)table賦值等內(nèi)容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua簡(jiǎn)介、編譯安裝教程及變量等語(yǔ)法介紹

    Lua簡(jiǎn)介、編譯安裝教程及變量等語(yǔ)法介紹

    這篇文章主要介紹了Lua簡(jiǎn)介、編譯安裝教程及變量等語(yǔ)法介紹,本文同時(shí)講解了lua注釋語(yǔ)法、Lua命令行方式等內(nèi)容,需要的朋友可以參考下 ...

    junjie3632020-04-14
  • LuaLua中table庫(kù)函數(shù)方法介紹

    Lua中table庫(kù)函數(shù)方法介紹

    這篇文章主要介紹了Lua中table庫(kù)函數(shù)方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua中計(jì)算、執(zhí)行字符串中Lua代碼的方法

    Lua中計(jì)算、執(zhí)行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計(jì)算、執(zhí)行字符串中Lua代碼的方法,類似JavaScript中eval函數(shù)的功能,在Lua中也可以實(shí)現(xiàn),需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • LuaLua和C語(yǔ)言的交互詳解

    Lua和C語(yǔ)言的交互詳解

    這篇文章主要介紹了Lua和C語(yǔ)言的交互詳解,Lua和C語(yǔ)言通過(guò)棧完成交互,本文結(jié)合代碼實(shí)例詳細(xì)講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
主站蜘蛛池模板: 免费看欧美黑人毛片 | h久久| 91成人在线免费观看 | 国产一区二区午夜 | 一级片久久免费 | 国产午夜精品一区二区三区视频 | 欧美精品一区二区三区四区 | 蜜桃网在线 | 欧美日韩电影在线 | 久久99深爱久久99精品 | 欧美精品电影一区 | 精品一区二区三区免费毛片 | 欧美日韩亚洲视频 | aaaaa国产欧美一区二区 | 欧美一二在线 | 亚洲第一页在线观看 | 特大黑人videos与另类娇小 | 日韩视频―中文字幕 | 午夜视频在线观看免费视频 | 黄色免费在线视频网站 | fc2国产成人免费视频 | 日本一区二区免费在线观看 | 国产精品久久久久久久久久东京 | 国产一区精品在线观看 | 久久国精品 | 国产精品久久久久久久娇妻 | 欧美成人免费 | 国产一区免费在线 | 九九色在线观看 | 毛片视频在线免费观看 | 久久久三区| 日韩欧美高清片 | 亚洲第一页中文字幕 | 欧美国产精品一区二区 | 亚洲免费视频一区 | 超久久| 成年性羞羞视频免费观看 | 亚洲特黄妇女高潮 | 美国人成人在线视频 | 久久大陆 | 爽爽淫人综合网网站 |