作者:沐風(第二人生成員)
版權所有,轉載請註明出處
在這篇文章中,我想介紹如何設計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。
字符串字符串,如果願意,可以包含“”字符。
表關系表類型,這個類型比較強大,後面再說。
函數函數類型,不要懷疑,函數也是壹個類型,也就是說所有的函數,本身就是壹個變量。
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語言壹樣,它支持壹些轉義字符,如下所示:
壹個鈴鐺
退位
f形進給
新行
回車
橫表
垂直制表符
\反斜杠
“雙引號
單引號
[左方括號
]右方括號
因為這種字符串只能寫壹行,所以不可避免的要使用轉義符。加入了壹串轉義字符,看起來真的很討人喜歡,比如:
“壹行
下壹行
“在引號中”,“在引號中”
大量的“”符號讓人看著就惡心。如果妳和我有同感,那麽在Lua中,我們可以用另壹種表達式:用“[”和“]]”把多行字符串括起來,比如:
page = [[
& ltHTML & gt
& ltHEAD & gt
& ltTITLE & gt壹個HTML頁面& lt/TITLE & gt;
& lt/HEAD & gt;
& ltBODY & gt
& ltA HREF="http://www.lua.org
本頁面不屬於NGA網站,NGA不保證其安全性。
繼續訪問和取消。不要再提示我[http://www.lua.org]" > 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.可以直接在網上看電子版
本頁面不屬於NGA網站,NGA不保證其安全性。
繼續訪問和取消。不要再提醒我[http://www.lua.org/pil/index.html]
當然,Lua最強大的功能是與宿主程序的緊密配合。因此,在下壹篇文章中,我會告訴妳如何在妳的程序中使用Lua語言作為腳本,使妳的程序與Lua腳本進行交互。
BBS.NGACN.COM
[瑤瑤]
豬小小2005-06-29 14:11
級別:老兵
帖子:721
聲望:13
財富:13
使用過程
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
其他
錯誤(“無效操作”)
結束
4.試壹試
除了for循環之外,Lua還支持多種循環。請用while重寫本文中的for程序...做並重復...直到。
BBS.NGACN.COM
[瑤瑤]
【二樓】小豬小2005-06-29 14:20
級別:老兵
帖子:721
聲望:13
財富:13
數組的使用
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,是大表中小表的存取方法。
BBS.NGACN.COM
[瑤瑤]
【三樓】yhcs 2005-06-29 14:25
級別:警告級別2
職位:89
聲望:-9
這個應該是頂級的,很好的收藏!
【四樓】豬小2005-06-29 14:38
級別:老兵
帖子:721
聲望:13
財富:13
還有壹些其他的高級寫作素材,但是在魔獸限定255字的條件下,估計用不到。所以這裏就不貼了。
BBS.NGACN.COM
[瑤瑤]
加繆2005-06-29 21:52
級別:思域
帖子:171
聲望:1
財富:1
變量的問題:
(1)lua好像不需要聲明變量,妳只需要給妳想用的變量賦值就可以了。根據賦值的類型,變量被自動鍵入。是這樣嗎?(當然,下面的文章中會提到這個例子:雖然這裏I是整數,但是Lua在處理的時候會自動將其轉換成字符串類型,我們不用擔心。-_-)
(2)
文章說:如果要定義局部變量,第壹次賦值時需要使用局部描述。
所以我寫宏的時候經常直接賦值,比如mp = unitmana(" player ")/unitmanamax(" player "),所以這個MP就成了全局變量?
+++++++++++++++++++++++
邏輯運算的問題
(2)壹般在寫宏的時候,and和or都有比較運算,所以這裏直接對兩個值進行邏輯運算有點別扭也是可以理解的。
比如第壹句不清楚,有false和nil的就清楚了,因為給出了規則。樓主能解釋壹下嗎?
(3)
a和b:如果a為假,則返回a;否則返回b。
a或b:如果a為真,則返回a;否則返回b。
這個規則怎麽解釋,還是說lua是這樣規定的?沒有任何解釋。
++++++++++++++++++++
結構問題
(4)如果如果...然後....文章中提到了elseif。....
但是現在寫宏的時候,很多人都像if壹樣嵌套...然後...如果...然後...如果...符合標準嗎?
++++++++++++++++++
最後感謝樓主提供的好文章。
BBS.NGACN.COM
我很想妳,這是真的,,,
【六樓】豬小2005-06-30 01:39
級別:老兵
帖子:721
聲望:13
財富:13
1,是的,所有未聲明的變量都是全局的。。。。甚至是妳在函數中定義的變量。我做過實驗,比如在宏中定義壹個變量A,賦給1。運行後,如果變量A也在另壹個宏中使用,如果在宏中調用它而沒有重新賦值,A的值仍然是妳之前使用的宏中賦給1的值。
但壹般不用擔心沖突,因為在大多數情況下,大多數人會習慣在宏中重新賦值壹個新變量,壹般不會造成太大問題。但是如果妳真的需要壹些全局變量,並且可以很容易的識別出來,妳可以在宏中用小寫字母表示局部變量,用大寫字母表示全局變量,因為Lua是嚴格區分大小寫的,所以妳可以很容易的使用局部變量和全局變量。
2,3,這個有點混亂。。。我這麽解釋吧。其實妳說的比較運算是邏輯運算,都是壹樣的。只是Lua擴展了and和or的使用。
其實通常and和or只能用布爾值,它們能得到的結果也只有布爾。也就是and和or只能對false和true進行運算,結果也不是false就是true。操作如下所示:
真假=假真假=假
假與假=假真與真=真
假或真=真真或假=真
假或假=假真或真=真
但是Lua擴展了and和or可以操作的數據類型,這樣它們也可以操作其他類型的數據。所以才有了這個方便的定義(當然妳可以說混淆定義)
a和b:如果a為假,則返回a;否則返回b。
a或b:如果a為真,則返回a;否則返回b。
現在我們可以嘗試用false和true替換A和B操作:
a =假b =真
真假=假
假或真=真
a =真b =假
真假=假
真或假=真
a =假b =假
假與假=假
假或假=假
a =真b =真
真實和真實=真實
真或真=真
看到了吧,其實結果和我們之前正常的邏輯運算是壹樣的。Lua只是and和or的擴展範圍。由於Lua對數據類型的定義沒有嚴格的要求,所以她的操作很方便,可以適應各種類型的數據。(其實不是解釋。她就是這麽定義的。方便或者混亂只是壹個想法,哈哈)
3,當然符合標準,嵌套屬於嵌套的用法,elseif屬於elseif。這兩種用法是不同的,雖然結果可能是壹樣的。但在某些情況下,嵌套方便就用嵌套,elseif方便。
BBS.NGACN.COM
[瑤瑤]
[7樓]陽光明媚的夏日
級別:警告級別1
帖子:481
聲望:-3
瘋狂。。。。。。。。。。。。。。。。。。。只有電腦高手才能玩這個遊戲嗎?
BBS.NGACN.COM
三個願望:【第七區無卡】【跨服戰場無排隊】【9城待定】
[8樓]深圳沙龍2005-06-30 09: 47
級別:思域
職位:44
聲望:0
以下引自《陽光夏日》發表於2005年6月30日07: 12:
瘋狂。。。。。。。。。。。。。。。。。。。只有電腦高手才能玩這個遊戲嗎?
wow的本質就是保證不同的人都能找到自己的樂趣。
電腦專家可能沒有泡菜的鍵盤熟練,泡菜也可能不知道插件和宏並不妨礙自己的樂趣~
只要手表幹擾別人~
暴雪是壹群天才,我崇拜了10年:P
樓主是高手,難得這麽有耐心,PFPF~
本來想發自己的集成插件效果圖,但是懶得找圖片空間。以後吧~
我用了大腳怪+Flexbar+Titan+Gather+super macro+Lax+移動任何東西+...
昨天大腳怪更新,不小心開了壹個新功能。被告知界面用了20M多內存,被迫退出遊戲~
@ @我到現在都在流汗~ ~ ~
此外,使用SuperMacro插件可以將宏腳本的最長字節增加到1023。
允許將快捷鍵直接綁定到宏(而不是拖到動作欄再綁定),允許使用其他宏的名字。
調用其他宏。安裝後即可使用。可以解決小MM說的字節限制問題。
[本帖由szsharo於2005年7月24日10: 00編輯]
BBS.NGACN.COM
術士是壹個優雅高貴的職業,尤其是帥氣的矮人術士~:P
【9樓】最接近上帝的牛2005-06-30 10:35
級別:思域
發布:5
聲望:1
財富:1
品格高尚的人