Lua程序的初步設計
作者:沐風(第二人生成員)
版權所有,轉載請註明出處
在這篇文章中,我想介紹如何設計Lua程序。我假設每個人都學過至少壹門編程語言,比如Basic或者C,尤其是C .因為Lua最大的用途是作為宿主程序中的腳本。
Lua的語法相對簡單易學,但功能也不弱。
在Lua中,除了關鍵字,壹切都是變量。請記住這句話。
壹、首先,評論。
寫程序的時候,總有註釋。
在Lua中,可以使用單行註釋和多行註釋。
在單行註釋中,兩個連續的減號“-”表示註釋的開始,並壹直延續到行尾。相當於C++語言中的“//”。
在多行註釋中,“-[[”表示註釋開始並持續到“]]”。這種註釋相當於“/*...*/"在C語言中。在註釋中,“[[”和“]]”可以嵌套。
二。Lua編程
經典的“Hello world”節目總是用來介紹壹種語言。在Lua中,編寫這樣的程序很簡單:
打印(“Hello world”)
在Lua中,可以使用分號“;”陳述之間。分開,也可以用空格分開。壹般來說,如果多條語句寫在同壹行,建議總是用分號隔開。
Lua有幾個程序控制語句,比如:
條件控制:if條件then … elseif條件then … else … end
While循環:while條件do … end
重復循環:重復…直到條件
For循環:for變量=初始值,結束值,step do … end。
For循環:對於表或枚舉函數中的變量1,變量2,…,變量n do … end。
註意for的循環變量總是只作用於for的局部變量,也可以省略step值。在這種情況下,for的循環將使用1作為步長值。
您可以使用break來停止循環。
如果妳有編程的基礎知識,比如Basic和C,妳會發現Lua並不難。但是Lua和這些編程語言有幾個地方明顯不同,所以請特別註意。
。語句塊
壹個語句塊在C++中用“{”和“}”括起來,在Lua中用do和end括起來。例如:
打印(“妳好”)結束
您可以在函數和語句塊中指定局部變量。
。賦值語句
賦值語句在Lua中得到了加強。它可以同時給多個變量賦值。
例如:
a,b,c,d=1,2,3,4
甚至:
a,b = b,a-多麽方便的交換變量的函數。
默認情況下,變量總是被認為是全局的。如果要定義局部變量,第壹次賦值時需要使用局部描述。例如:
局部A,B,C = 1,2,3-A,B,C都是局部變量。
。數值運算
和C語言壹樣,支持+,-,*,/。但是Lua多了壹個" "。這意味著指數冪運算。例如,2 ^ 3的結果是8,2 ^ 4的結果是16。
要連接兩個字符串,可以使用“..”接線員。比如:
“這壹個”..“字符串。”——等於“這壹串”
。比較操作
& lt& gt& lt= & gt= == ~=
分別表示小於、大於、不大於、不小於、等於、不等於。
所有這些運算符總是返回true或false。
對於表、函數和用戶數據類型的數據,只能使用= =和~ =兩種類型。相等意味著兩個變量引用相同的數據。例如:
a={1,2}
b=a
print(a==b,a~=b) -真,假
a={1,2}
b={1,2}
print(a==b,a~=b) -假,真
。邏輯運算
和,或者,不是
其中,與和或與C語言有很大不同。
這裏請記住,在Lua中,只有false和nil被計算為false,其他所有數據都被計算為true,0也是true!
and和or的運算結果不是真與假,而是和它的兩個操作數有關。
a和b:如果a為假,則返回a;否則返回b。
a或b:如果a為真,則返回a;否則返回b。
舉幾個例子:
打印(4和5) ->五
print(nil和13) ->無
print(false和13)->;錯誤的
打印(4或5) ->四
print(假或5)-& gt;五
這是Lua中壹個非常有用但又令人困惑的特性。
我們可以模仿C語言中的語句:x = a?B: c,在Lua中,可以寫成:x = a和b或c。
最有用的語句是:x = x或v,相當於:如果不是x那麽x = v結束。
的優先權。運算符,從高到低如下:
^
非-(壹元運算)
* / + -
..(字符串連接)
& lt& gt& lt= & gt= ~= ==
和
或者
三。關鍵詞
關鍵字不能用作變量。Lua的關鍵詞不多,就以下幾個:
打破其他的自我
函數if結束false
在本地nil not或
重復return然後true直到while
四。變量類型
如何確定壹個變量的類型?可以使用type()函數來檢查。Lua支持以下類型:
空值,所有未使用的變量都是零。Nil既是值也是類型。
布爾布爾值
數值,在Lua中,數值相當於C語言中的double。
字符串String,如果您願意,它可以包含字符' \0 '。
表關系表類型,這個類型比較強大,後面再說。
函數函數類型,不要懷疑,函數也是壹個類型,也就是說所有的函數,本身就是壹個變量。
Userdata嗯,這個類型是專門用來對付Lua的主機的。主機通常用C和C++編寫。在這種情況下,Userdata可以是主機的任何數據類型,常用的有Struct和pointer。
Thread線程類型,Lua中沒有真正的線程。Lua可以將壹個函數分成幾個部分來運行。有興趣可以看看Lua的文檔。
變量的定義
所有語言都使用變量。在Lua中,無論在什麽地方使用變量,都不需要聲明,所有這些變量永遠是全局變量,除非妳在前面加上“local”。
這壹點要特別註意,因為妳可能想在函數中使用局部變量,卻忘了用局部來解釋。
至於變量名,是區分大小寫的。換句話說,A和A是兩個不同的變量。
定義變量的方法是賦值。“=”操作用於賦值。
讓我們壹起定義幾種常見的變量類型。
A.無
如前所述,未使用變量的值都為零。有時候我們也需要清除壹個變量。這時我們可以直接給變量賦壹個nil值。比如:
var 1 = nil-請註意nil必須是小寫的。
B.布爾代數學體系的
在進行條件判斷時,通常使用布爾值。布爾值有兩種:真和假。在Lua中,只有false和nil被評估為false,其他所有類型的值都為true。如0、空字符串等。,都是真的。不要被C語言的習慣誤導了,0在Lua裏是真的。您也可以直接將布爾值賦給變量,例如:
varboolean = true
C.數字
在Lua中,沒有整數類型,也不需要。壹般來說,只要數值不是很大(比如不超過100,000,000,000,000,000,000),就不會出現舍入誤差。在很多CPU上,實數的運算並不比整數慢。
實數的表示類似於C語言,比如:
4 0.4 4.57e-3 0.3e12 5e+20
D.線
String始終是壹種非常常見的高級類型。在Lua中,可以很容易地定義很長的字符串。
在Lua中有幾種方法來表達壹個字符串。最常見的方法是用雙引號或單引號將字符串括起來,例如:
“這是壹根弦。”
與C語言壹樣,它支持壹些轉義字符,如下所示:
\壹個鈴鐺
\b後退空間
\f換頁
\n換行符
\r回車
\t水平制表符
\v垂直制表符
\\反斜杠
“雙引號
\ '單引號
\[左方括號
\]右方括號
因為這種字符串只能寫壹行,所以不可避免的要使用轉義符。加入了壹串轉義字符,看起來真的很討人喜歡,比如:
"壹行\n下壹行\n\ "引號\ ",'引號'"
大量的“\”符號讓人看著就惡心。如果妳和我有同感,那麽在Lua中,我們可以用另壹種表達式:用“[”和“]]”把多行字符串括起來,比如:
page = [[
& ltHTML & gt
& ltHEAD & gt
& ltTITLE & gt壹個HTML頁面& lt/TITLE & gt;
& lt/HEAD & gt;
& ltBODY & gt
& ltHREF = " http://www . Lua . org " & gt;Lua & lt/A & gt;
[[方括號中的文本]]
& lt/BODY & gt;
& lt/HTML & gt;
]]
值得註意的是,在這類字符串中,如果有單個“[”或“]]”,還是要用“\ [”或“\]”,避免歧義。當然這種情況很少。
E.桌子
關系表類型,這是壹種非常強大的類型。我們可以把這種類型看作壹個數組。只是C語言中的數組,只能用正整數索引;在Lua中,可以使用任何類型來索引數組,除了nil。同樣,在C語言中,數組的內容只允許有壹種類型;在Lua中,還可以使用任何類型的值作為數組的內容,除了nil。
Table的定義很簡單,它的主要特點是用“{”和“}”把壹系列數據元素括起來。例如:
T1 = {} -定義壹個空表。
t 1[1]= 10——那麽我們就可以像C語言壹樣使用它了。
T1["John"]={Age=27,Gender="Male"}
這句話相當於:
t 1[" John "]= { }-必須先將其定義為表。記住,未定義的變量是nil類型的。
T1["約翰"]["年齡"]=27
T1["約翰"]["性別"]= "男性"
當表的索引是壹個字符串時,我們可以將其縮寫為:
T1。約翰={}
T1。約翰。年齡=27歲
T1。約翰。性別= "男性"
或者
T1。約翰{年齡=27歲,性別= "男性" }
這是壹個非常強大的功能。
在定義表的時候,我們可以把所有的數據壹起寫在“{”和“}”之間,非常方便美觀。例如,T1的先前定義可以寫成如下:
T1=
{
10,-相當於[1] = 10。
[100] = 40,
約翰= -如果妳喜歡,妳也可以寫:["約翰"] =
{
年齡=27,-如果妳願意,也可以寫:[“年齡”] =27。
性別=男性——如果妳願意,也可以寫:[“性別”]=男性。
},
20-相當於[2] = 20
}
它看起來很漂亮,不是嗎?當我們寫作時,我們需要註意三點:
第壹,所有的元素總是用逗號“,”隔開;
第二,所有指標值都需要用“[”和“]”括起來;如果是字符串,還可以去掉引號和括號;
第三,如果不寫索引,索引會被認為是壹個數,從1開始按順序自動編譯;
表類型的構造如此方便,以至於它們經常被用來代替配置文件。是的,毫無疑問,它比ini文件更漂亮,更強大。
F.功能
函數,在Lua中,函數的定義也很簡單。典型定義如下:
函數Add (a,b)-Add是函數名,A和B是參數名。
Return a+b - return用於返回函數的運行結果。
結束
請註意,返回語言必須在end之前編寫。如果非要在中間放壹個返回句,請寫成:do return end。
記住函數也是變量類型。上述函數定義實際上相當於:
add =函數(a,b)返回a+b結束
當您將值重新分配給add時,它不再代表此功能。您甚至可以將任何數據賦值給add,包括nil(這樣,您就清除了add變量)。函數像不像C語言中的函數指針?
和C語言壹樣,Lua的函數可以接受可變參數,也是用“…”定義的,比如:
函數和(a,b,…)
如果想得到用…表示的參數,可以在函數中訪問arg局部變量(表類型)來得到。
比如sum(1,2,3,4)
然後,在函數中,a = 1,b = 2,arg = {3,4}。
更有價值的是,它可以同時返回多個結果,例如:
函數s()
返回1,2,3,4
結束
a,B,C,D = S()——此時,a = 1,b = 2,c = 3,d = 4。
如前所述,表類型可以有任何類型的值,包括函數!所以,壹個很強大的特點就是,有函數的表,哦,我覺得說對象更合適。Lua可以使用面向對象編程。不信?那我給妳舉以下例子:
t =
{
年齡= 27歲
add =函數(self,n) self。年齡=自身。年齡+n端
}
印刷品(t.Age) - 27
t.add(t,10)
印刷品(t.Age) - 37
不過t.add(t,10)有點土吧?沒關系,在Lua中,妳可以將其縮寫為:
t:add(10)-相當於t.add(t,10)。
G.用戶數據和線程
這兩類話題超出了本文的內容,不打算細說。
結束語
結束了嗎?當然不是。接下來,妳需要使用Lua解釋器來幫助妳理解和練習。這篇文章只是為了幫助妳對Lua的語法有壹個大致的了解。如果妳有編程基礎,相信妳很快就會習慣Lua。
就像C語言壹樣,Lua提供了相當多的標準函數來增強語言的功能。使用這些標準函數,您可以輕松操作各種數據類型,並處理輸入和輸出。這方面的資料可以參考《Lua中的編程》這本書,在http://www.lua.org/pil/index.html.可以直接在網上看電子版
使用例程
1.功能的使用
下面的程序演示了如何在Lua中使用函數和局部變量。
示例e02.lua
-功能
畢達哥拉斯函數(a,b)
本地c2 = a^2 + b^2
返回sqrt(c2)
結束
print(畢達哥拉斯(3,4))
運行結果
五
程序說明
Lua中函數的定義格式是:
函數函數名(參數)
...
結束
與Pascal不同,end不需要與begin成對出現,只需在函數末尾鍵入end即可。
這個例子的作用是通過知道直角三角形的直角邊來求斜邊長。參數A和B分別代表直角邊長。
函數中定義了局部變量來存儲斜邊的平方。和C語言壹樣,是在函數中定義的。
代碼不會被直接執行,只有當主程序調用。
局部意味著定義壹個局部變量。如果不加local,只是說明c2是全局變量,局部的範圍。
它位於最內層的末尾和它的成對關鍵字之間,例如if...結束,而...結束等。全局變量
範圍是整個程序。
2.循環語句
示例e03.lua
-循環
因為i=1,5 do
打印(“我就是現在”..我)
結束
運行結果
我現在是1
我現在2歲了
我現在3歲了
我現在4歲了
我現在5歲了
程序說明
這裏我們使用for語句。
For變量=參數1,參數2,參數3 do。
循環體
結束
在參數3的步驟中,變量將從參數1變為參數2。
例如:
對於i=1,f(x)做打印(I)結束
對於i=10,1,-1做打印(I)結束
在這裏打印(“我是現在”..我),我們使用..,用於連接兩個字符串。
無意中看中了(1)裏提到的東西,不知道妳有沒有看錯。
雖然這裏I是壹個整數,但是Lua在處理的時候會自動轉換成壹個字符串,我們就不用費心了。
3.條件轉移語句
示例e04.lua
-循環和條件
因為i=1,5 do
打印(“我就是現在”..我)
如果我& lt2然後
打印(“小”)
elseif i & lt那麽4
打印(“中等”)
其他
打印(“大”)
結束
結束
運行結果
我現在是1
小的
我現在2歲了
媒介
我現在3歲了
媒介
我現在4歲了
大的
我現在5歲了
大的
程序說明
If else使用簡單,類似C語言,但是這裏要註意的是,整個If只需要壹端。
即使使用了壹個以上的elseif,也仍然是目的。
例如
如果op == "+"那麽
r = a + b
elseif op == "-"那麽
r = a - b
elseif op == "* "那麽
r = a*b
elseif op == "/"然後
r = a/b
其他
錯誤(“無效操作”)
結束
數組的使用
1.介紹
Lua語言只有壹個基本的數據結構,就是表,其他都是數組等數據結構。
類,這些都可以用表來實現。
2.2 .表格的下標
示例e05.lua
-數組
我的數據= {}
myData[0] = "foo "
myData[1] = 42
-哈希表
myData["bar"] = "baz "
-循環訪問
-結構
對於鍵,myData中的值
打印(鍵.."=" ..值)
結束
輸出結果
0=foo
1=42
bar=baz
程序說明
首先,定義壹個表myData={},然後用數字作為下標給它賦值。這種。
定義方法類似於C中的數組,但與數組不同的是,每個數組元素不需要屬於同壹類型。
就像這個例子,壹個是整數,壹個是字符串。
在程序的第二部分,字符串被用作下標,壹個元素被添加到表中。這張桌子很漂亮
比如地圖。STL中的表下標,可以是Lua支持的任何基本類型,nil值除外。
Lua自動處理Table占用的內存,如下面的代碼所示。
a = {}
a["x"] = 10
b = a - `b '指與` a '相同的表格
print(b[" x "])-& gt;10
b["x"] = 20
print(a[" x "])-& gt;20
a =零-現在只有“b”仍然指該表
b = nil——現在沒有對表的引用了
b和a都指向同壹個表,只占用壹塊內存。當執行a = nil時,b仍然指向表。
當執行b=nil時,由於沒有指向table的變量,Lua會自動釋放table占用的內存。
3.3的嵌套。桌子
Table的使用也可以是嵌套的,如下例所示。
示例e06.lua
-表“構造函數”
我的多邊形= {
color= "藍色",
厚度=2,
npoints = 4;
{x=0,y=0},
{x=-10,y=0},
{x=-5,y=4},
{x=0,y=4}
}
-打印顏色
print(myPolygon["color"])
-使用dot再次打印
-符號
打印(myPolygon.color)
-這些點是可以訪問的
-在myPolygon[1]到myPolygon[4]中
-打印第二個點的x
坐標
print(myPolygon[2])。x)
程序說明
首先,建立壹個表。與上例不同的是,表的構造函數中有{x=0,y=0}。
這是什麽意思?這實際上是壹個小表,定義在大表內,而小表
省略了表名。
最後壹行,myPolygon[2]。x,是大表中小表的存取方法。