Lua腳本語言簡(jiǎn)明教程.ppt_第1頁
Lua腳本語言簡(jiǎn)明教程.ppt_第2頁
Lua腳本語言簡(jiǎn)明教程.ppt_第3頁
Lua腳本語言簡(jiǎn)明教程.ppt_第4頁
Lua腳本語言簡(jiǎn)明教程.ppt_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1 21 2020 Agenda 簡(jiǎn)介Lua語言基礎(chǔ)Lua高級(jí)特性 面向?qū)ο?capi Lua腳本語言簡(jiǎn)介 前言 lua語言簡(jiǎn)介 我假設(shè)大家都學(xué)過至少一門編程語言 比如Basic或C 特別是C 因?yàn)長ua的最大用途是在宿主程序中作為腳本使用的 Lua的語法比較簡(jiǎn)單 學(xué)習(xí)起來也比較省力 但功能卻并不弱 在Lua中 一切都是變量 除了關(guān)鍵字 請(qǐng)記住這句話 葡萄牙語 Luna 月亮 1993 里約熱內(nèi)盧天主教大學(xué) 巴西作者 RobertoIerusalimschyLuizHenriquedeFigueiredoWaldemarCeles簡(jiǎn)介 一個(gè)功能強(qiáng)大 快速 輕量級(jí) 可嵌入的腳本語言 程序語法構(gòu)造簡(jiǎn)單 用關(guān)鍵數(shù)組來實(shí)現(xiàn)強(qiáng)大的數(shù)據(jù)描述功能 同時(shí)還提供一些可擴(kuò)展的語義特征動(dòng)態(tài)類型 無需編譯 由解釋器先翻譯成lua虛擬機(jī)的指令 然后在虛擬機(jī) 基于寄存器實(shí)現(xiàn) 上運(yùn)行 使用一個(gè)采用增量策略的GC來管理內(nèi)存 WhyLua Fast 最快的腳本語言 luajit更是接近CCleanANSIC可移植性好 Embeddable 可嵌入 多種語言嵌入支持 膠水語言C API可擴(kuò)展性強(qiáng) 接口簡(jiǎn)單 自身擴(kuò)展 利用外部語言擴(kuò)展簡(jiǎn)單 但是功能強(qiáng)大 動(dòng)態(tài)類型 metatable 內(nèi)存管理體積小 輕量級(jí) 100ksize 8kmemoryOpenSource 經(jīng)過行業(yè)驗(yàn)證 靠譜 Lua現(xiàn)狀 移動(dòng)應(yīng)用 網(wǎng)絡(luò)游戲 云計(jì)算 嵌入式 Lua腳本語言基礎(chǔ) 第一節(jié) 首先是注釋 寫一個(gè)程序 總是少不了注釋的 在Lua中 你可以使用單行注釋和多行注釋 第二節(jié) 語句 經(jīng)典的 Helloworld print Helloworld 在Lua中 語句之間可以用分號(hào) 隔開 也可以用空白隔開 程序控制語句 如 條件控制 if條件then elseif條件then else endWhile循環(huán) while條件do endRepeat循環(huán) repeat until條件For循環(huán) for變量 初值 終點(diǎn)值 步進(jìn)do endFor循環(huán) for變量1 變量2 變量Nin表或枚舉函數(shù)do end注意一下 for的循環(huán)變量總是只作用于for的局部變量 你也可以省略步進(jìn)值 這時(shí)候 for循環(huán)會(huì)使用1作為步進(jìn)值 你可以用break來中止一個(gè)循環(huán) 第三節(jié) 語句塊 語句塊在C 中是用 和 括起來的 在Lua中 它是用do和end括起來的 比如 doprint Hello end你可以在函數(shù)中和語句塊中定局部變量 第四節(jié) 賦值語句 賦值語句在Lua被強(qiáng)化了 它可以同時(shí)給多個(gè)變量賦值 例如 a b c d 1 2 3 4甚至是 a b b a 多么方便的交換變量功能啊 在默認(rèn)情況下 變量總是認(rèn)為是全局的 假如你要定義局部變量 則在第一次賦值的時(shí)候 需要用local說明 比如 locala b c 1 2 3 a b c都是局部變量 第五節(jié) 數(shù)值運(yùn)算 和C語言一樣 支持 但Lua還多了一個(gè) 這表示指數(shù)乘方運(yùn)算 比如2 3結(jié)果為8 2 4結(jié)果為16 連接兩個(gè)字符串 可以用 運(yùn)處符 如 Thisa string 等于 thisastring 第六節(jié) 比較運(yùn)算 分別表示小于 大于 不大于 不小于 相等 不相等所有這些操作符總是返回true或false 對(duì)于Table Function和Userdata類型的數(shù)據(jù) 只有 和 可以用 相等表示兩個(gè)變量引用的是同一個(gè)數(shù)據(jù) 比如 a 1 2 b aprint a b a b true falsea 1 2 b 1 2 print a b a b false true 第七節(jié) 邏輯運(yùn)算一 and or not其中 and和or與C語言區(qū)別特別大 在Lua中 只有false和nil為false 其它任何數(shù)據(jù)都計(jì)算為true 0也是true and和or的運(yùn)算結(jié)果不是true和false 而是和它的兩個(gè)操作數(shù)相關(guān) aandb 如果a為false 則返回a 否則返回baorb 如果a為true 則返回a 否則返回b舉幾個(gè)例子 print 4and5 5print niland13 nilprint falseand13 falseprint 4or5 4print falseor5 5 第七節(jié) 邏輯運(yùn)算二 在Lua中這是很有用的特性 也是比較令人混洧的特性 我們可以模擬C語言中的語句 x a b c 在Lua中 可以寫成 x aandborc 最有用的語句是 x xorv 它相當(dāng)于 ifnotxthenx vend 運(yùn)算符優(yōu)先級(jí) 從高到低順序如下 not 一元運(yùn)算 字符串連接 andor 第八節(jié) 關(guān)鍵字 關(guān)鍵字是不能做為變量的 Lua的關(guān)鍵字不多 就以下幾個(gè) andbreakdoelseelseifendfalseforfunctionifinlocalnilnotorrepeatreturnthentrueuntilwhile 第九節(jié) 變量類型 怎么確定一個(gè)變量是什么類型的呢 大家可以用type 函數(shù)來檢查 Lua支持的類型有以下幾種 nil空值 所有沒有使用過的變量 都是nil nil既是值 又是類型 boolean布爾值number數(shù)值 在Lua里 數(shù)值相當(dāng)于C語言的doublestring字符串 如果你愿意的話 字符串是可以包含 字符的table關(guān)系表類型 這個(gè)類型功能比較強(qiáng)大 我們?cè)诤竺媛f function函數(shù)類型 不要懷疑 函數(shù)也是一種類型 也就是說 所有的函數(shù) 它本身就是一個(gè)變量 userdata嗯 這個(gè)類型專門用來和Lua的宿主打交道的 宿主通常是用C和C 來編寫的 在這種情況下 Userdata可以是宿主的任意數(shù)據(jù)類型 常用的有Struct和指針 thread線程類型 在Lua中沒有真正的線程 Lua中可以將一個(gè)函數(shù)分成幾部份運(yùn)行 如果感興趣的話 可以去看看Lua的文檔 1 21 2020 第九節(jié) 變量類型 nilbooleannumberstringtablefunctionuserdatathread 第十節(jié) 變量的定義 字符串 總是一種非常常用的高級(jí)類型 在Lua中 你可以非常方便的定義很長很長的字符串 字符串在Lua中有幾種方法來表示 最通用的方法 是用雙引號(hào)或單引號(hào)來括起一個(gè)字符串的 如 Thisisastring 和C語言相同的 它支持一些轉(zhuǎn)義字符 列表如下 abellbbackspacefformfeednnewlinercarriagereturnthorizontaltabvverticaltab backslash doublequote singlequote leftsquarebracket rightsquarebracket 第十節(jié) 變量的定義 由于這種字符串只能寫在一行中 因此 不可避免的要用到轉(zhuǎn)義字符 加入了轉(zhuǎn)義字符的串 看起來實(shí)在是不敢恭維 比如 onelinennextlinen inquotes inquotes 一大堆的 符號(hào)讓人看起來很倒胃口 如果你與我有同感 那么 我們?cè)贚ua中 可以用另一種表示方法 用 和 將多行的字符串括起來 如 page AnHTMLPageLua atextbetweendoublebrackets 值得注意的是 在這種字符串中 如果含有單獨(dú)使用的 或 就仍然得用 或 來避免歧義 當(dāng)然 這種情況是極少會(huì)發(fā)生的 第十節(jié) 變量的定義 Table關(guān)系表類型 這是一個(gè)很強(qiáng)大的類型 我們可以把這個(gè)類型看作是一個(gè)數(shù)組 只是C語言的數(shù)組 只能用正整數(shù)來作索引 在Lua中 你可以用任意類型來作數(shù)組的索引 除了nil 同樣 在C語言中 數(shù)組的內(nèi)容只允許一種類型 在Lua中 你也可以用任意類型的值來作數(shù)組的內(nèi)容 除了nil 第十節(jié) 變量的定義 Table的定義很簡(jiǎn)單 它的主要特征是用 和 來括起一系列數(shù)據(jù)元素的 比如 T1 定義一個(gè)空表T1 1 10 然后我們就可以象C語言一樣來使用它了 T1 John Age 27 Gender Male 這一句相當(dāng)于 T1 John 必須先定義成一個(gè)表 還記得未定義的變量是nil類型嗎T1 John Age 27T1 John Gender Male 當(dāng)表的索引是字符串的時(shí)候 我們可以簡(jiǎn)寫成 T1 John T1 John Age 27T1 John Gender Male 或T1 John Age 27 Gender Male 這是一個(gè)很強(qiáng)的特性 第十節(jié) 變量的定義 在定義表的時(shí)候 我們可以把所有的數(shù)據(jù)內(nèi)容一起寫在 和 之間 這樣子是非常方便 而且很好看 比如 前面的T1的定義 我們可以這么寫 T1 10 相當(dāng)于 1 10 100 40 John 如果你原意 你還可以寫成 John Age 27 如果你原意 你還可以寫成 Age 27Gender Male 如果你原意 你還可以寫成 Gender Male 20 相當(dāng)于 2 20 看起來很漂亮 不是嗎 我們?cè)趯懙臅r(shí)候 需要注意三點(diǎn) 第一 所有元素之間 總是用逗號(hào) 隔開 第二 所有索引值都需要用 和 括起來 如果是字符串 還可以去掉引號(hào)和中括號(hào) 第三 如果不寫索引 則索引就會(huì)被認(rèn)為是數(shù)字 并按順序自動(dòng)從1往后編 第十節(jié) 變量的定義 functionfunctionadd a b add是函數(shù)名字 a和b是參數(shù)名字returna b return用來返回函數(shù)的運(yùn)行結(jié)果end還記得前面說過 函數(shù)也是變量類型嗎 上面的函數(shù)定義 其實(shí)相當(dāng)于 add function a b returna bend當(dāng)你重新給add賦值時(shí) 它就不再表示這個(gè)函數(shù)了 你甚至可以賦給add任意數(shù)據(jù) 包括nil 這樣 你就清除了add變量 Function是不是很象C語言的函數(shù)指針呢 第十節(jié) 變量的定義 和C語言一樣 Lua的函數(shù)可以接受可變參數(shù)個(gè)數(shù) 它同樣是用 來定義的 比如 functionsum a b 如果想取得 所代表的參數(shù) 可以在函數(shù)中訪問arg局部變量 表類型 得到 如sum 1 2 3 4 則 在函數(shù)中 a 1 b 2 arg 3 4 更可貴的是 它可以同時(shí)返回多個(gè)結(jié)果 比如 functions return1 2 3 4enda b c d s 此時(shí) a 1 b 2 c 3 d 4 functionsum a b iftable getn arg 0thenreturna belselcoalsum a bforI vinipairs arg dosum arg i endreturnsum 1 21 2020 前面說過 表類型可以擁有任意類型的值 包括函數(shù) 因此 有一個(gè)很強(qiáng)大的特性是 擁有函數(shù)的表 哦 我想更恰當(dāng)?shù)膽?yīng)該說是對(duì)象吧 Lua可以使用面向?qū)ο缶幊塘?不信 那我舉例如下 t Age 27add function self n self Age self Age nend print t Age 27t add t 10 print t Age 37不過 t add t 10 這一句實(shí)在是有點(diǎn)土對(duì)吧 沒關(guān)系 在Lua中 你可以簡(jiǎn)寫成 t add 10 相當(dāng)于t add t 10 第十節(jié) 變量的定義 第十節(jié) 變量的定義 Userdata和Thread這兩個(gè)類型的話題 超出了本文的內(nèi)容 就不打算細(xì)說了 第十一課 使用流程 以下程序演示了如何在Lua中使用函數(shù) 及局部變量例e02 lua functionsfunctionpythagorean a b localc2 a 2 b 2returnsqrt c2 endprint pythagorean 3 4 運(yùn)行結(jié)果5程序說明在Lua中函數(shù)的定義格式為 function函數(shù)名 參數(shù) end 第十一課 使用流程2 與Pascal語言不同 end不需要與begin配對(duì) 只需要在函數(shù)結(jié)束后打個(gè)end就可以了 本例函數(shù)的作用是已知直角三角形直角邊 求斜邊長度 參數(shù)a b分別表示直角邊長 在函數(shù)內(nèi)定義了local形變量用于存儲(chǔ)斜邊的平方 與C語言相同 定義在函數(shù)內(nèi)的代碼不會(huì)被直接執(zhí)行 只有主程序調(diào)用時(shí)才會(huì)被執(zhí)行 local表示定義一個(gè)局部變量 如果不加local剛表示c2為一個(gè)全局變量 local的作用域是在最里層的end和其配對(duì)的關(guān)鍵字之間 如if end while end等 全局變量的作用域是整個(gè)程序 第十二節(jié) 循環(huán)語句 例e03 lua Loopsfori 1 5doprint iisnow i end 運(yùn)行結(jié)果iisnow1iisnow2iisnow3iisnow4iisnow5 第十二節(jié) 循環(huán)語句2 程序說明這里偶們用到了for語句for變量 參數(shù)1 參數(shù)2 參數(shù)3do循環(huán)體end變量將以參數(shù)3為步長 由參數(shù)1變化到參數(shù)2例如 fori 1 f x doprint i endfori 10 1 1doprint i end這里print iisnow i 中 偶們用到了 這是用來連接兩個(gè)字符串的 偶在 1 的試試看中提到的 不知道你們答對(duì)了沒有 雖然這里i是一個(gè)整型量 Lua在處理的時(shí)候會(huì)自動(dòng)轉(zhuǎn)成字符串型 不需偶們費(fèi)心 第十三節(jié) Table的嵌套 Table的使用還可以嵌套 如下例例e06 lua Table constructor myPolygon color blue thickness 2 npoints 4 x 0 y 0 x 10 y 0 x 5 y 4 x 0 y 4 Printthecolorprint myPolygon color Printitagainusingdot notationprint myPolygon color Thepointsareaccessible inmyPolygon 1 tomyPolygon 4 Printthesecondpoint sx coordinateprint myPolygon 2 x 第十四節(jié) Table的嵌套2 程序說明首先建立一個(gè)table 與上一例不同的是 在table的constructor里面有 x 0 y 0 這是什么意思呢 這其實(shí)就是一個(gè)小table 定義在了大table之內(nèi) 小table的table名省略了 最后一行myPolygon 2 x 就是大table里面小table的訪問方式 1 21 2020 Lua高級(jí)特性 面向?qū)ο驝API 1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論