【正文】
local k = 如果我們?cè)俅握{(diào)用newCounter,將創(chuàng)建一個(gè)新的局部變量i,因此我們得到了一個(gè)作用在新的變量i上的新閉包。(upvalue意思有些誤導(dǎo),然而在Lua中他的存在有歷史的根源,還有他比起external local variable簡(jiǎn)短)。 pare the gradesend)假定創(chuàng)建一個(gè)函數(shù)實(shí)現(xiàn)此功能:function sortbygrade (names, grades)function mark (x,y) {name = arraial, default is false (nil) default check mandatory options n=2}如上面所示,Lua會(huì)將前面的實(shí)參傳給函數(shù)的固定參數(shù),后面的實(shí)參放在arg表中。 return t[i], unpack(t, i + 1)a39。a = {foo0()} x=nil, y=nilx,y = foo1()a39。,39。 23s, e = (hello Lua users, Lua)print(s, e)function f(a, b) return a or b end ... i = i + 1end有時(shí)候?yàn)榱苏{(diào)試或者其他目的需要在block的中間使用return或者break,可以顯式的使用do..end來(lái)實(shí)現(xiàn):function foo ()再看一個(gè)遍歷表key的例子: print all keys of table 39。i39。end。 0 1 a=10。{x=10, y=45。 another field = nil =0。 /+ 兩個(gè)點(diǎn)字符串連接,如果操作數(shù)為數(shù)字,Lua將數(shù)字轉(zhuǎn)成字符串。 5print(nil and 13) false (alphabetical order!)為了避免不一致的結(jié)果,混合比較數(shù)字和字符串,Lua會(huì)報(bào)錯(cuò),比如:2 15 邏輯運(yùn)算符and = 0c = aa==c but a~=bLua比較數(shù)字按傳統(tǒng)的數(shù)字大小進(jìn)行,比較字符串按字母的順序進(jìn)行,但是字母順序依賴(lài)于本地環(huán)境。 算術(shù)運(yùn)算符二元運(yùn)算符:+ * / ^\\39。 change string partsprint(a) Booleans兩個(gè)取值false和true。 string變量沒(méi)有預(yù)定義的類(lèi)型,每一個(gè)變量都可能包含任一種類(lèi)型的值。利用這個(gè)特性,我們可以通過(guò)配置,靈活的設(shè)置交互模式的環(huán)境。 ifin保留字:以下字符為L(zhǎng)ua的保留字,不能當(dāng)作標(biāo)識(shí)符。你鍵入的每個(gè)命令(比如:Hello World)在你鍵入回車(chē)之后立即被執(zhí)行,鍵入文件結(jié)束符可以退出交互模式(CtrlD in Unix, CtrlZ in DOS/Windows),()函數(shù)也可以退出。 感謝在完成本書(shū)的過(guò)程中,很多人給了我極大的幫助:Luiz Henrique de Figueiredo和Waldemar Celes給了我很大的幫助,使得本書(shū)能夠更好完成,Luiz Henrique也幫助設(shè)計(jì)了本書(shū)的內(nèi)部。這部分既包括基本的語(yǔ)言的控制結(jié)構(gòu),也包括高級(jí)的迭代子和協(xié)同。在受限系統(tǒng)中使用Lua,如嵌入式系統(tǒng),我們可以有選擇地安裝這些類(lèi)庫(kù)。Lua的擴(kuò)展性非常卓越,以至于很多人把Lua用作搭建領(lǐng)域語(yǔ)言的工具(注:比如游戲腳本)。但是與其他語(yǔ)言不同的是,不僅用Lua編寫(xiě)的軟件易于擴(kuò)展,而且用其他語(yǔ)言比如C/C++編寫(xiě)的軟件也很容易使用Lua擴(kuò)展其功能。Lua本身是以簡(jiǎn)單優(yōu)雅為本,著眼于處理那些C不擅長(zhǎng)的任務(wù)。敵對(duì)三人登時(shí)意存輕視,溫青臉上不自禁露出失望的神色。Lua的優(yōu)雅,也只有使用后才會(huì)明白。for _,e in ipairs(helpful_guys) doLua所提供的機(jī)制是C不善于的:高級(jí)語(yǔ)言、動(dòng)態(tài)結(jié)構(gòu)、簡(jiǎn)潔、易于測(cè)試和調(diào)試等。他的完全發(fā)布版(代碼、手冊(cè)以及某些平臺(tái)的二進(jìn)制文件)僅用一張軟盤(pán)就可以裝得下。這些類(lèi)型用LuaAPI注冊(cè)新函數(shù),創(chuàng)建新類(lèi)型,通過(guò)配置Lua就可以改變應(yīng)用宿主語(yǔ)言的行為。 Lua的相關(guān)資源如果你真得想學(xué)一門(mén)語(yǔ)言,參考手冊(cè)是必備的。很明顯的是,這些變化給本書(shū)帶來(lái)很大的沖擊,有些內(nèi)容失去了它存在理由,比如關(guān)于超值(upvalues)的復(fù)雜的解釋。Alexandre Nakonechnyj負(fù)責(zé)本書(shū)的封面和內(nèi)部設(shè)計(jì)。 else ChunksChunk是一系列語(yǔ)句,Lua執(zhí)行的每一塊語(yǔ)句,比如一個(gè)文件或者交互模式下的每一行都是一個(gè)Chunk。另一個(gè)連接外部Chunk的方式是使用dofile函數(shù),: file 39。 else腳本前面的參數(shù)從1開(kāi)始減少。 nilprint(type(type(X)))一般有個(gè)錯(cuò)誤的看法CPU運(yùn)算浮點(diǎn)數(shù)比整數(shù)慢。為了風(fēng)格統(tǒng)一,最好使用一種,除非兩種引號(hào)嵌套情況。 \\ double quote 右中括號(hào)例子: print(one line\nnext line\n\in quotes\, 39。\97lo\10\0492339。line = () true Functions函數(shù)是第一類(lèi)值(和其他變量相同),意味著函數(shù)可以存儲(chǔ)在變量中,可以作為函數(shù)的參數(shù),也可以作為函數(shù)的返回值。 == .. 最簡(jiǎn)單的構(gòu)造函數(shù)是{},用來(lái)創(chuàng)建一個(gè)空表。 swap 39。當(dāng)變量個(gè)數(shù)和值的個(gè)數(shù)不一致時(shí),Lua會(huì)一直以變量個(gè)數(shù)為基礎(chǔ)采取以下策略:a. 變量個(gè)數(shù) 值的個(gè)數(shù) 局部變量與代碼塊(block)使用local創(chuàng)建一個(gè)局部變量,與全局變量不同,局部變量只在被聲明的那個(gè)代碼塊內(nèi)有效。while i=x do local x x = 20a239。 elsepartend。until conditions。 statementslist。 dofile (39。 f({x=10, y=20})type{} for i,val in ipairs(a) do mi = i end returns no resultsfunction foo1 () return 39。 returns 2 results第一,當(dāng)作為表達(dá)式調(diào)用函數(shù)時(shí),有以下幾種情況:1. 當(dāng)調(diào)用作為表達(dá)式最后一個(gè)參數(shù)或者僅有一個(gè)參數(shù)時(shí),根據(jù)變量個(gè)數(shù)函數(shù)盡可能多地返回多個(gè)值,不足補(bǔ)nil,超出舍去。b39。a39。 x=39。 aprint(foo(2))例如,我們可以重寫(xiě)print函數(shù):printResult = printResult = printResult .. \nend有時(shí)候我們可能需要幾個(gè)固定參數(shù)加上可變參數(shù)function g (a, b, ...) end elseif type() ~= number then _Window(,第6章 再論函數(shù)Lua中的函數(shù)是帶有詞法定界(lexical scoping)的第一類(lèi)值(firstclass values)。table標(biāo)準(zhǔn)庫(kù)提供一個(gè)排序函數(shù),接受一個(gè)表作為輸入?yún)?shù)并且排序表中的元素。 {name = lua,在Lua中,高級(jí)函數(shù)與普通函數(shù)沒(méi)有區(qū)別,它們只是把“作為參數(shù)的函數(shù)”當(dāng)作第一類(lèi)值(firstclass value)處理而已。 Terminal sizeTermSize = {w = 80, h = 24} wait before spoiling the screenend要想讓這個(gè)例子正確的運(yùn)行,你必須調(diào)整你的終端類(lèi)型和代碼中的控制符[3]一致:plot(function (x) return (x*2*) end)將在屏幕上輸出一個(gè)正弦曲線(xiàn)。技術(shù)上來(lái)講,閉包指值而不是指函數(shù),函數(shù)僅僅是閉包的一個(gè)原型聲明;盡管如此,在不會(huì)導(dǎo)致混淆的情況下我們繼續(xù)使用術(shù)語(yǔ)函數(shù)代指閉包。因?yàn)楹瘮?shù)被存儲(chǔ)在普通的變量?jī)?nèi)我們可以很方便的重定義或者預(yù)定義函數(shù)。c1 = newCounter()print(c1()) anonymous function*39。 IP = }, now refers to the print functionsin(10, 20) or 0, error(no height) return ((fmt, unpack(arg)))end這個(gè)例子將文本格式化操作和寫(xiě)操作組合為一個(gè)函數(shù)。 a=3, b=4, arg={n=0}g(3, 4, 5, 8) a一個(gè)return語(yǔ)句如果使用圓括號(hào)將返回值括起來(lái)也將導(dǎo)致返回一個(gè)值。 (no results)可以使用圓括號(hào)強(qiáng)制使調(diào)用返回一個(gè)值。, 39。 a = {39。 1print(foo2() .. x) x=39。b39。 return m, miend if val m then message]] 如果要退出循環(huán),使用break語(yǔ)句。for i=1,f(x) do elsepartend??梢詫⑦@段代碼放在do..end(相當(dāng)于c/c++的{})塊中。 print(x) 1 {x=10, y=1}, list = {next=list, value=line}end這段代碼從標(biāo)準(zhǔn)輸入讀進(jìn)每行,然后反序形成鏈表。 (a+i) ((b/2)+1)5+x^2*8 ==andor除了^和..外所有的二元運(yùn)算符都是左連接的。 (unary)*也就是說(shuō)當(dāng)且僅當(dāng)兩者表示同一個(gè)對(duì)象時(shí)相等。例如:用標(biāo)準(zhǔn)I/O庫(kù)來(lái)描述文件。(page)運(yùn)行時(shí),Lua會(huì)自動(dòng)在string和numbers之間自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換,當(dāng)一個(gè)字符串使用算術(shù)操作符時(shí),string就會(huì)被轉(zhuǎn)成數(shù)字。\\\39。 5e+20 Strings指字符的序列。 numbera = a string!!print(type(a))函數(shù)type可以測(cè)試給定變量或者值的類(lèi)型。 orrepeat elseifend local n2 = x^2 + y^2 return n * fact(n1)還有的時(shí)候,我順利的寫(xiě)完某個(gè)章節(jié),結(jié)果卻是沒(méi)有人能看得懂我寫(xiě)的或者沒(méi)有人對(duì)我在這個(gè)章節(jié)內(nèi)表達(dá)的觀(guān)點(diǎn)達(dá)成一致。 ;模式串也是用單引號(hào),比如39。第三:還有一些使用者使用其他語(yǔ)言開(kāi)發(fā),把Lua當(dāng)作庫(kù)使用。Lua大部分強(qiáng)大的功能來(lái)自于他的類(lèi)庫(kù),這并非偶然。對(duì)那種在產(chǎn)品的生命周期內(nèi)變化比較多的應(yīng)用方向使用Lua可以更方便的適應(yīng)變化。2005年7月26日第一篇 語(yǔ)言第0章 序言本章包括作者的序言、文章的體例(convention)以及其它一些“每本書(shū)開(kāi)頭都會(huì)的內(nèi)容”。 參與校對(duì),helpful_guys = {主流文化的C/C++、Java、C、VB[1];偏安一隅的Fortran;動(dòng)態(tài)語(yǔ)言中的Perl、Tcl、Ruby、Forth、Python,以及本書(shū)介紹的Lua;……,等等等等。當(dāng)今武林,派別林立,語(yǔ)言繁雜,林林總總不計(jì)其數(shù)。 desc: to print the list of the contributing guys又通常情況下,組件(或?qū)ο螅┍憩F(xiàn)為具體在程序開(kāi)發(fā)過(guò)程中很少變化的、占用大量CPU時(shí)間的決定性的程序,例如窗口部件和數(shù)據(jù)結(jié)構(gòu)。Lua不是通過(guò)使用條件編譯實(shí)現(xiàn)平臺(tái)無(wú)關(guān),而是完全使用ANSI (ISO) C,這意味著只要你有ANSI C編譯器你就可以編譯并使用Lua。我們可以這樣認(rèn)為:Lua是文本處理領(lǐng)域的嵌入式語(yǔ)言。a39。當(dāng)你想盡力去解釋清楚如何使用的前提是你應(yīng)該覺(jué)得使用這個(gè)東西很容易,這表明Lua某些地方需要被改進(jìn)。 no action (ment)]] 命令行方式lua [options] [script [args]]e:直接將命令傳入Luaprompt lua e print((12))Lua中有8個(gè)基本類(lèi)型分別為:nil、boolean、number、string、userdata、function、thread和table。 functionprint(type(type))a backslash inside quotes: \39。page = [[HTMLHEADTITLEAn HTML Page/TI