freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

最新整理的lua程序設(shè)計很完整-資料下載頁

2025-07-30 02:00本頁面
  

【正文】 n=0}g(3, 4) a=3, b=4, arg={n=0}g(3, 4, 5, 8) a=3, b=4, arg={5, 8。 n=2}如上面所示,Lua會將前面的實參傳給函數(shù)的固定參數(shù),后面的實參放在arg表中。舉個具體的例子。一個典型的方法是使用啞元(dummy variable,下劃線):local _, x = (s, p) now use `x39。...還可以利用可變參數(shù)聲明一個select函數(shù):function select (n, ...) return arg[n]endprint((hello hello, hel)) 6 9print(select(1, (hello hello, hel))) 6print(select(2, (hello hello, hel))) 9有時候需要將函數(shù)的可變參數(shù)傳遞給另外的函數(shù)調(diào)用,可以使用前面我們說過的unpack(arg)返回arg表所有的可變參數(shù),(類似C語言的sprintf函數(shù)):function fwrite(fmt, ...) return ((fmt, unpack(arg)))end這個例子將文本格式化操作和寫操作組合為一個函數(shù)。 命名參數(shù)Lua的函數(shù)參數(shù)是和位置相關(guān)的,調(diào)用時實參會按順序依次傳給形參。有時候用名字指定參數(shù)是很有用的,比如rename函數(shù)用來給一個文件重命名,有時候我們我們記不清命名前后兩個參數(shù)的順序了: invalid coderename(old=, new=)上面這段代碼是無效的,Lua可以通過將所有的參數(shù)放在一個表中,把表作為函數(shù)的唯一參數(shù)來實現(xiàn)上面這段偽代碼的功能。因為Lua語法支持函數(shù)調(diào)用時實參可以是表的構(gòu)造。rename{old=, new=}根據(jù)這個想法我們重定義了rename:function rename (arg) return (, )end當函數(shù)的參數(shù)很多的時候,這種函數(shù)參數(shù)的傳遞方式很方便的。例如GUI庫中創(chuàng)建窗體的函數(shù)有很多參數(shù)并且大部分參數(shù)是可選的,可以用下面這種方式:w = Window { x=0, y=0, width=300, height=200, title = Lua, background=blue, border = true}function Window (options) check mandatory options if type() ~= string then error(no title) elseif type() ~= number then error(no width) elseif type() ~= number then error(no height) end everything else is optional _Window(, or 0, default value or 0, default value , , or white, default default is false (nil) )end第6章 再論函數(shù)Lua中的函數(shù)是帶有詞法定界(lexical scoping)的第一類值(firstclass values)。第一類值指:在Lua中函數(shù)和其他值(數(shù)值、字符串)一樣,函數(shù)可以被存放在變量中,也可以存放在表中,可以作為函數(shù)的參數(shù),還可以作為函數(shù)的返回值。詞法定界指:嵌套的函數(shù)可以訪問他外部函數(shù)中的變量。這一特性給Lua提供了強大的編程能力。Lua中關(guān)于函數(shù)稍微難以理解的是函數(shù)也可以沒有名字,匿名的。當我們提到函數(shù)名(比如print),實際上是說一個指向函數(shù)的變量,像持有其他類型值的變量一樣:a = {p = print}(Hello World) Hello Worldprint = `print39。 now refers to the sine function(print(1)) sin = `sin39。 now refers to the print functionsin(10, 20) 10 20既然函數(shù)是值,那么表達式也可以創(chuàng)建函數(shù)了,Lua中我們經(jīng)常這樣寫:function foo (x) return 2*x end這實際上是Lua語法的特例,下面是原本的函數(shù):foo = function (x) return 2*x end函數(shù)定義實際上是一個賦值語句,將類型為function的變量賦給一個變量。我們使用function (x) ... end來定義一個函數(shù)和使用{}創(chuàng)建一個表一樣。table標準庫提供一個排序函數(shù),接受一個表作為輸入?yún)?shù)并且排序表中的元素。這個函數(shù)必須能夠?qū)Σ煌愋偷闹担ㄗ址蛘邤?shù)值)按升序或者降序進行排序。Lua不是盡可能多地提供參數(shù)來滿足這些情況的需要,而是接受一個排序函數(shù)作為參數(shù)(類似C++的函數(shù)對象),排序函數(shù)接受兩個排序元素作為輸入?yún)?shù),并且返回兩者的大小關(guān)系,例如:network = { {name = grauna, IP = }, {name = arraial, IP = }, {name = lua, IP = }, {name = derain, IP = },}如果我們想通過表的name域排序:(network, function (a,b) return ( )end)以其他函數(shù)作為參數(shù)的函數(shù)在Lua中被稱作高級函數(shù)(higherorder function),如上面的sort。在Lua中,高級函數(shù)與普通函數(shù)沒有區(qū)別,它們只是把“作為參數(shù)的函數(shù)”當作第一類值(firstclass value)處理而已。下面給出一個繪圖函數(shù)的例子:function eraseTerminal() (\27[2J)end writes an 39。*39。 at column 39。x39。 , 39。row y39。function mark (x,y) ((\27[%d。%dH*, y, x))end Terminal sizeTermSize = {w = 80, h = 24} plot a function (assume that domain and image are in the range [1,1])function plot (f) eraseTerminal() for i=1, do local x = (i/)*2 1 local y = (f(x) + 1)/2 * mark(i, y) end () wait before spoiling the screenend要想讓這個例子正確的運行,你必須調(diào)整你的終端類型和代碼中的控制符[3]一致:plot(function (x) return (x*2*) end)將在屏幕上輸出一個正弦曲線。將第一類值函數(shù)應(yīng)用在表中是Lua實現(xiàn)面向?qū)ο蠛桶鼨C制的關(guān)鍵,這部分內(nèi)容在后面章節(jié)介紹。 閉包當一個函數(shù)內(nèi)部嵌套另一個函數(shù)定義時,內(nèi)部的函數(shù)體可以訪問外部的函數(shù)的局部變量,這種特征我們稱作詞法定界。雖然這看起來很清楚,事實并非如此,詞法定界加上第一類函數(shù)在編程語言里是一個功能強大的概念,很少語言提供這種支持。下面看一個簡單的例子,假定有一個學生姓名的列表和一個學生名和成績對應(yīng)的表;現(xiàn)在想根據(jù)學生的成績從高到低對學生進行排序,可以這樣做:names = {Peter, Paul, Mary}grades = {Mary = 10, Paul = 7, Peter = 8}(names, function (n1, n2) return grades[n1] grades[n2] pare the gradesend)假定創(chuàng)建一個函數(shù)實現(xiàn)此功能:function sortbygrade (names, grades) (names, function (n1, n2) return grades[n1] grades[n2] pare the grades end)end例子中包含在sortbygrade函數(shù)內(nèi)部的sort中的匿名函數(shù)可以訪問sortbygrade的參數(shù)grades,在匿名函數(shù)內(nèi)部grades不是全局變量也不是局部變量,我們稱作外部的局部變量(external local variable)或者upvalue。(upvalue意思有些誤導,然而在Lua中他的存在有歷史的根源,還有他比起external local variable簡短)。看下面的代碼:function newCounter() local i = 0 return function() anonymous function i = i + 1 return i endendc1 = newCounter()print(c1()) 1print(c1()) 2匿名函數(shù)使用upvalue i保存他的計數(shù),當我們調(diào)用匿名函數(shù)的時候i已經(jīng)超出了作用范圍,因為創(chuàng)建i的函數(shù)newCounter已經(jīng)返回了。然而Lua用閉包的思想正確處理了這種情況。簡單的說,閉包是一個函數(shù)以及它的upvalues。如果我們再次調(diào)用newCounter,將創(chuàng)建一個新的局部變量i,因此我們得到了一個作用在新的變量i上的新閉包。c2 = newCounter()print(c2()) 1print(c1()) 3print(c2()) 2cc2是建立在同一個函數(shù)上,但作用在同一個局部變量的不同實例上的兩個不同的閉包。技術(shù)上來講,閉包指值而不是指函數(shù),函數(shù)僅僅是閉包的一個原型聲明;盡管如此,在不會導致混淆的情況下我們繼續(xù)使用術(shù)語函數(shù)代指閉包。閉包在上下文環(huán)境中提供很有用的功能,如前面我們見到的可以作為高級函數(shù)(sort)的參數(shù);作為函數(shù)嵌套的函數(shù)(newCounter)。這一機制使得我們可以在Lua的函數(shù)世界里組合出奇幻的編程技術(shù)。閉包也可用在回調(diào)函數(shù)中,比如在GUI環(huán)境中你需要創(chuàng)建一系列button,但用戶按下button時回調(diào)函數(shù)被調(diào)用,可能不同的按鈕被按下時需要處理的任務(wù)有點區(qū)別。具體來講,一個十進制計算器需要10個相似的按鈕,每個按鈕對應(yīng)一個數(shù)字,可以使用下面的函數(shù)創(chuàng)建他們:function digitButton (digit) return Button{ label = digit, action = function () add_to_display(digit) end }end這個例子中我們假定Button是一個用來創(chuàng)建新按鈕的工具, label是按鈕的標簽,action是按鈕被按下時調(diào)用的回調(diào)函數(shù)。(實際上是一個閉包,因為他訪問upvalue digit)。digitButton完成任務(wù)返回后,局部變量digit超出范圍,回調(diào)函數(shù)仍然可以被調(diào)用并且可以訪問局部變量digit。閉包在完全不同的上下文中也是很有用途的。因為函數(shù)被存儲在普通的變量內(nèi)我們可以很方便的重定義或者預(yù)定義函數(shù)。通常當你需要原始函數(shù)有一個新的實現(xiàn)時可以重定義函數(shù)。例如你可以重定義sin使其接受一個度數(shù)而不是弧度作為參數(shù):oldSin = = function (x) return oldSin(x*)end更清楚的方式:do local oldSin = local k = = function (x) return oldSin(x*k) endend這樣我們把原始版本放在一個局部變量內(nèi),訪問sin的唯一方式是通過新版本的函數(shù)。利用同樣的特征我們可以創(chuàng)建一個安全的環(huán)境(也稱作沙箱,和java里的沙箱一樣),當我們運行一段不信任的代碼(比如我們運行網(wǎng)絡(luò)服務(wù)器上獲取的代碼)時安全的環(huán)境是需要的,比如我們可以使用閉包重定義io庫的open函數(shù)來限制程序打開的文件。do local oldOpen = = function (filename, mode) if access_OK(filename, mode) then return oldOpen(filename, mode) else return nil, access denied end endend 非全局函數(shù)Lua中函數(shù)可以作為全局變量也可以作為局部變量,我們已經(jīng)看到一些例子:函數(shù)作為table的域(、)。這種情況下,必須注意函數(shù)和表語法:1. 表和函數(shù)放在一起Lib = {} = function (x,y) return x + y end = function (x,y) return x y end2. 使用表構(gòu)造函數(shù)Lib = { foo = function (x,y) return x + y end, goo = function (x,y) return x y end}3. Lua提供另一種語法方式Lib = {}function (x,y) return x + yendfunction (x,y)
點擊復制文檔內(nèi)容
電大資料相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1