![esp8266學(xué)習(xí)開發(fā)lua52中文參考手冊_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/a183d875-18ae-438a-9afc-e5c609bd7a0e/a183d875-18ae-438a-9afc-e5c609bd7a0e1.gif)
![esp8266學(xué)習(xí)開發(fā)lua52中文參考手冊_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/a183d875-18ae-438a-9afc-e5c609bd7a0e/a183d875-18ae-438a-9afc-e5c609bd7a0e2.gif)
![esp8266學(xué)習(xí)開發(fā)lua52中文參考手冊_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/a183d875-18ae-438a-9afc-e5c609bd7a0e/a183d875-18ae-438a-9afc-e5c609bd7a0e3.gif)
![esp8266學(xué)習(xí)開發(fā)lua52中文參考手冊_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/a183d875-18ae-438a-9afc-e5c609bd7a0e/a183d875-18ae-438a-9afc-e5c609bd7a0e4.gif)
![esp8266學(xué)習(xí)開發(fā)lua52中文參考手冊_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/a183d875-18ae-438a-9afc-e5c609bd7a0e/a183d875-18ae-438a-9afc-e5c609bd7a0e5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Lua 用戶參考手冊目錄介紹10基本概念 -2.2 -2.3 -2.4 -2.5 -值與類型10環(huán)境表與全局環(huán)境12錯誤處理12元表與元方法12回收182.5.1 -回收元方法192.5.2 - 弱表202.6 - 協(xié)程20語言213.3.1 -3.2 -3.3 -詞法約定22變量23語句243.3.1 -3.3.2 -3.3.3 -3.3.4 -語句塊24代碼塊24賦值25結(jié)構(gòu)253.3.5 - for 語句263.3.6 - 函數(shù)調(diào)用語句273.3.7 - 局部. 273.4 -表達(dá)式283.4.1 -3.4.2 -3.4.3 -3.4.4 -3.4.5 -3.4.6 -
2、3.4.7 -算術(shù)操作符29強制轉(zhuǎn)換29關(guān)系操作符29邏輯操作符29連接符30長度操作符30優(yōu)先級303.4.8 - table 構(gòu)造313.4.9 - 函數(shù)調(diào)用313.4.10 - 函數(shù)定義323.5 - 可視規(guī)則33應(yīng)用程序接口(API)344.4.1 -4.2 -4.3 -棧34棧大小35合法的和可接受的索引354.4 - C 閉包354.5 -表364.6 - C 中的錯誤處理364.7 - C 中的 yields 處理364.8 - 函數(shù)與類型37lua_absindex37lua_Alloc37lua_arith38lua_atpanic39lua_call39lua_callk3
3、9lua_CFunction40lua_checkstack40lua_close40lua_compare41lua_concat41lua_copy41lua_createtable41lua_dump42lua_error42lua_gc42lua_glocf.43lua_getctx43lua_getfield43lua_getglobal43lua_getmetatable44lua_gettable44lua_gettop44lua_getuservalue44lua_insert44lua_Integer.45lua_isboolean45lua_iscfunction45lua
4、_isfunction45lua_islightuserdata45lua_isnil46lua_isnone46lua_isnoneornil46lua_isnumber.46lua_isstring46lua_istable46lua_isthread47lua_isuserdata47lua_len47lua_load47lua_newstate48lua_newtable48lua_newthread48lua_newuserdata48lua_next49lua_Number.49lua_pcall49lua_pcallk50lua_pop50lua_pushboolean50lua
5、_pushcclosure51lua_pushcfunction51lua_pushfstring51lua_pushglobaltable52lua_pushinteger52lua_pushlightuserdata52lua_pushliteral52lua_pushlstring52lua_pushnil53lua_pushnumber.53lua_pushstring53lua_pushthread53lua_pushunsigned53lua_pushvalue54lua_pushvfstring54lua_rawequal54lua_rawget54lua_rawgeti54lu
6、a_rawgetp55lua_rawlen55lua_rawset55lua_rawseti55lua_rawsetp55lua_Reader56lua_register.56lua_remove56lua_replace56lua_resume56lua_slocf.57lua_setfield57lua_setglobal57lua_setmetatable57lua_settable58lua_settop58lua_setuservalue58lua_State58lua_status58lua_toboolean59lua_tocfunction59lua_tointeger59lu
7、a_tointegerx59lua_tolstring59lua_tonumber60lua_tonumberx60lua_topointer60lua_tostring60lua_tothread61lua_tounsigned61lua_tounsignedx61lua_touserdata61lua_type61lua_typename62lua_Unsigned62lua_upvalueindex62lua_version62lua_Writer62lua_xmove63lua_yield63lua_yieldk634.9 調(diào)試接口63lua_Debug64lua_gethook65l
8、ua_gethookcount65lua_gethookmask65lua_getinfo65lua_getlocal66lua_getstack66lua_getupvalue66lua_Hook67lua_sethook67lua_setlocal68lua_setupvalue68lua_upvalueid68lua_upvaluejoin685. 輔助庫695.1 - 函數(shù)與類型69luaL_addchar69luaL_addlstring69luaL_addsize69luaL_addstring70luaL_addvalue70luaL_argcheck70luaL_argerro
9、r70luaL_Buffer70luaL_buffinit71luaL_buffinitsize71luaL_callmeta71luaL_checkany72luaL_checkint72luaL_checkinteger72luaL_checklong72luaL_checklstring72luaL_checknumber73luaL_checkoption73luaL_checkstack73luaL_checkstring73luaL_checktype74luaL_checkudata74luaL_checkunsigned74luaL_checkversion74luaL_dof
10、ile74luaL_dostring75luaL_error75luaL_execresult75luaL_fileresult75luaL_getmetafield75luaL_getmetatable76luaL_getsubtable76luaL_gsub76luaL_len76luaL_loadbuffer76luaL_loadbufferx77luaL_loadfile77luaL_loadfilex77luaL_loadstring77luaL_newlib78luaL_newlibtable78luaL_newmetatable78luaL_newstate78luaL_open
11、libs79luaL_optint79luaL_optinteger79luaL_optlong79luaL_optlstring79luaL_optnumber80luaL_optstring80luaL_optunsigned80luaL_prepbuffer80luaL_prepbuffsize81luaL_pushresult81luaL_pushresultsize81luaL_ref81luaL_Reg81luaL_requiref82luaL_setfuncs82luaL_setmetatable82luaL_testudata82luaL_tolstring83luaL_tra
12、ceback83luaL_typename83luaL_unref83luaL_where83標(biāo)準(zhǔn)庫846.1 - 基礎(chǔ)函數(shù)84assert (v , message)84collectgarbage (opt , arg)85dofile (filename)85error (message , level)85_G86getmetatable (object)86ipairs (t)86load (ld , source , mode , env)86loadfile (filename , mode , env)86next (table , index)87pairs (t)87pca
13、ll (f , arg1, ···)87print (···)87rawequal (v1, v2)87rawget (table, index)87rawlen (v)88rawset (table, index, value)88select (index, ···)88setmetatable (table, metatable)88tonumber (e , base)88tostring (v)88type (v)89_VERSION89xpcall (f, msgh , arg1, ·
14、;··)896.2 - 協(xié)程操作896.coroutine.create (f).89coroutine resume (co , val1, ···).89coroutine running ()89coroutine.status (co).90coroutine.wrap (f).90coroutine.yield (···)90模塊90require (modname)90package.config91package.cpath91package.loaded91package.loadlib (libn
15、ame, funcname).91package.path91package.preload92package.searchers92package.searchpath (name, path , sep , rep).92字符串操作93string.byte (s , i , j)93string.char (···).93string.dump (function).93string.find (s, pattern , init , plain).93string.format (formatstring, ···).94st
16、ring.gmatch (s, pattern)94string.gsub (s, pattern, repl , n)95string.len (s).95string.lower (s)96string.match (s, pattern , init)96string.rep (s, n , sep).96string.reverse (s)96string.sub (s, i , j)96string.upper (s)966.3 -6.4 -6.4.1 - 模式96字符類型:96模式項:97模式:98捕獲:986.5 - table 操作98table.concat (list ,
17、sep , i , j)98table.insert (list, pos, value)98table.pack (···)98table.remove (list , pos).99table.sort (list , comp).99table.unpack (list , i , j)996.6 - 數(shù)學(xué)函數(shù)99math.abs (x)99math.acos (x)99math.asin (x)99math.atan (x)100math.atan2 (y, x).100math.ceil (x)100math.cos (x)100math.cosh (x
18、)100math.deg (x)100math.exp (x)100math.floor (x).100math.fmod (x, y)100math.frexp (x)101math.huge101math.ldexp (m, e).101math.log (x , base).101math.max (x, ···).101math.min (x, ···).101math.modf (x)101math.pi101math.pow (x, y)101math.rad (x)102math.random (m , n).102ma
19、th.randomseed (x)102math.sin (x)102math.sinh (x)102math.sqrt (x)102math.tan (x)102math.tanh (x)102位操作102bit32.arshift (x, disp).103bit32.band (···).103bit32.bnot (x)103bit32.bor (···).103bit32.btest (···).103bit32.bxor (···)103bit32.extract
20、 (n, field , width)103bit32 replace (n, v, field , width)104bit32.lrotate (x, disp).104bit32.lshift (x, disp).104bit32 rrotate (x, disp).104bit32 rshift (x, disp).104輸入與輸出相關(guān)函數(shù)105io.close (file)1056.7 -6.8 -io.flush ()105io.input (file)105io.lines (filename ···)105io.open (filename , m
21、ode)106io.output (file)106io.popen (prog , mode)106io.read (···)106io.tmpfile ()106io.type (obj)106io.write (···)107file:close ()107file:flush ()107file:lines (···)107file:read (···)107file:seek (whence , offset)107file:setvbuf (mode , size
22、)108file:write (···)108操作系統(tǒng)相關(guān)函數(shù)108os.clock ()108os.date (format , time)108os.difftime (t2, t1)109os.execute (command)109os.exit (code , close)109os.getenv (varname)109os.remove (filename)109os.rename (oldname, newname)110os.setlocale (locale , category)110os.time (table)110os.tmpname
23、()1106.9 -6.10 - 調(diào)試相關(guān)函數(shù)110debug.debug ()111debug.gethook (thread)111debug.getinfo (thread, f , what)111debug.getlocal (thread, f, local)111debug.getmetatable (value)112debug.getregistry ()112debug.getupvalue (f, up)112debug.getuservalue (u)112debug.sethook (thread, hook, mask , count)112debug.setloc
24、al (thread, level, local, value)112debug.setmetatable (value, table)113debug.setupvalue (f, up, value)113debug.setuservalue (udata, value)113debug.traceback (thread, message , level)113debug.upvalueid (f, n)113debug.upvaluejoin (f1, n1, f2, n2).113使用 lua113與之前版本的不同1158.1 - 語言上的變化1158.2 - 標(biāo)準(zhǔn)庫的變化1158.
25、3 - API 的變化116完整的 Lua 語法1.前言這是譯者第一次翻譯此類手冊,本身英文水平不高,估計會有誤譯,歡迎來信討論更正,郵箱:isaf_lua。1. 介紹Lua 是一種有很強數(shù)據(jù)描述能力且擴展性非常強的編程語言。它還為面向?qū)ο缶幊獭⒑瘮?shù)式編程和數(shù)據(jù)驅(qū)動編程提供了很好的支持。Lua 的目標(biāo)是要成為一種強大的、輕量的、可嵌入的 語言,以便任何項目都可以使用它。Lua 使用標(biāo)準(zhǔn) C 和 C+兩者的子集來編寫的,以庫的形式實現(xiàn)。作為一種擴展性語言,Lua 沒有“main”這個概念:它只作為一個嵌入模塊來使用,它可以調(diào)用自身,也可以調(diào)用宿主語言(即使用 Lua 的語言)。
26、宿主語言可以執(zhí)行 Lua 的代碼,可以讀寫 Lua 代碼中的變量,可以將 C 函數(shù)給 Lua 代碼調(diào)用。通過使用 C 函數(shù),Lua 可以擴展為廣泛適用于各種領(lǐng)域,比如創(chuàng)建自定義語法框架的編程語言。Lua 的發(fā)布版本包含有一個名字叫 lua 的程序,它是使用 Lua 庫實現(xiàn)的一個編程及批處理。解釋器,可以用于交互式根據(jù) Lua 的實現(xiàn)可以在 Lua 的,Lua 是:證的,不需要中找得到。就可以使用。本手冊中描述的相關(guān)和其它的參考手冊一種,這份文檔比較枯燥無味。如果想要了解 Lua 設(shè)計背后做的一些決定,你可以在 lua 官網(wǎng)中找到相關(guān)的技術(shù)討論頁面。如果你想要了解 Lua 編程的可以閱讀 Rob
27、erto 的書:Programming in Lua。細(xì)節(jié),2. 基本概念本章說明 Lua 的一些基本概念。2.1 - 值與類型Lua 是一種動態(tài)類型的編程語言。這意味著 Lua 的變量沒有類型,只有值才有類型。因此,Lua 沒有類型定義這個行為。所有的值都能通過自身來表示的類型。Lua 中的所有值都是“第一類(first-class)”值。這意味著所有的值都可以儲存在變量中,可以當(dāng)作參數(shù)傳給函數(shù),可以被函數(shù)當(dāng)結(jié)果返回。Lua 一共有 8 種基本數(shù)據(jù)類型:空值(nil),布爾(boolean),數(shù)字(number),字符串(string),函數(shù)(function),用戶數(shù)據(jù)(userdata)
28、,線程(thread)和表(table)。其中值 nil 的類型是空值,它的主要作用就是用來區(qū)分別的值,通常用來表示其它類型的缺省值。值 false 和 true 的類型是布爾型。nil 和 false 在條件中都表示 false,其它任意值則表示 true。數(shù)字類型就是指一切的數(shù)字(雙精度浮點數(shù)),操作數(shù)字類型值的時必須遵守C 語言的規(guī)則,也即 IEEE754 標(biāo)準(zhǔn)。(你可以很容易去修改 Lua 數(shù)字類型的底層表示,比如你可以將數(shù)字類型的表示修改為單精度浮點型或長整型,具體可以看 luaconf h 這個源代碼文件)字符串類型是一種不可改變的字符序列。字符串中可以包含所有的 8 位的字符,包
29、括終結(jié)符(0)。Lua 可以調(diào)用(和處理)Lua 和 C 實現(xiàn)的函數(shù)。(參考 3.4.9)用戶數(shù)據(jù)類型(以下用 userdata 表示)可以保存任意的 C 數(shù)據(jù)類型。一個 userdata 實際上是一個指向某塊內(nèi)存空間的指針。一共有兩種 userdata:full userdata 和 light userdata。前者指向的內(nèi)存由 Lua 管理,后者指向的內(nèi)存由宿主語言(C 或其它)管理。除了賦值和相等性比較操作,userdata 沒有預(yù)定義的其它操作,但是通過使用元表(metatable),你可以定義 full userdata 的(參考 2.4)。在 Lua 代碼中是不能創(chuàng)建 userd
30、ata 的值的,userdata的值只能通過 C API 來創(chuàng)建和修改,這樣可以保證宿主數(shù)據(jù)的安全性。線程類型表示一個線程和操作系統(tǒng)的線程操作系統(tǒng)。的執(zhí)行過程,它可以用來實現(xiàn)協(xié)程(參考 2.6)。不要把 Lua 的,Lua 在所有的操作系統(tǒng)上都支持協(xié)程,包括那些不支持線程的表類型(以下用 table 表示)是一種關(guān)聯(lián)數(shù)組,除了可以用數(shù)字作為 table 的索引(也可以叫鍵)外,還可以使用除了 nil 和 NaN(一種未定義或不可表示的數(shù)字類型,比如 0/0) 外的所有 Lua 值來作索引。table 中的值可以是任意類型的(除了 nil)。也就是說,如果一個鍵對應(yīng)的值為 nil,則認(rèn)為這個鍵不
31、屬于 table 的一部分。反過來說,table 中一個不存在的鍵,它關(guān)聯(lián)的值就是一個 nil。table 是 Lua 中唯一的數(shù)據(jù)結(jié)構(gòu);它可以用來表示數(shù)組,序列,符號表,集合,圖,樹等。為了表示一個,Lua 使用帶有名字的域來表示 table 的索引,比如 a name,它是 a“name”的一種語法糖(syntactic sugar)。在 Lua 中,有好幾種很方便的方法來創(chuàng)建tables。(參考 3.4.8)我們使用“序列”這個術(shù)語來描述索引為從 1 至 n 的 table,n 表示序列的長度。(參考3.4.6)和索引一樣,table 中的值也可以是 Lua 中任意類型的值。因為函數(shù)是第
32、一類值,所以table 中的值可以是函數(shù),即 table 是可以帶方法的。(參考 3.4.10)使用索引去獲得 table 中的一個值時,它要遵守語言的“原始相等”規(guī)則。表達(dá)式 ai和 aj表示同一個元素的前提是 i 和 j 是原始相等的(即 i 和 j 沒有元方法)。table,函數(shù),線程和 full userdata 類型的值都是類型,即它們保存的值并不是實際的數(shù)據(jù)而是一個,因此,對這些類型的值進(jìn)行賦值、參數(shù)傳遞、函數(shù)中返回等操作的操作對象都是它們的,這些操作都不產(chǎn)生數(shù)據(jù)的副本??梢允褂?Lua 標(biāo)準(zhǔn)庫中的 type 函數(shù)來獲得指定值的類型名字。(參考 6.1)2.2 -環(huán)境表與全局環(huán)境任
33、何的全局變量名 var 在語法分析的時候都會被翻譯為_ENV.var 的形式,這個會在 3.2 和 3.3.3 時再討論。每一個代碼塊在它的作用域內(nèi)都有一個叫_ENV 的外部局部變量(參考3.3.2),所以_ENV 在代碼塊里也不是一個全局變量。雖然_ENV 看起來像是編譯器生成的內(nèi)容,但它確是實實在在存在的。你可以直接在Lua 的代碼中使用_ENV 來定義一個新的變量和參數(shù)。每一個通過_ENV 它在程序中是被全局可見的,它遵守 Lua 的可見性規(guī)則(參考 3.5)。任何一個用法如_ENV 一樣的 table 都稱為環(huán)境。的全局名字,Lua 中保留了一個特殊的全局環(huán)境。它的值被保留在 Lua
34、棧中,通過一個特殊的索引值來(參考 4.5)。在 Lua 的代碼中,變量_G 指向這個值。當(dāng)編譯一個代碼塊時,Lua 會把全局環(huán)境中的內(nèi)容作為數(shù)據(jù)來初始化_ENV(參考 load)。因此,Lua 代碼中的全局變量指的是全局環(huán)境中的內(nèi)容。此外,所有標(biāo)準(zhǔn)庫中的函數(shù)都會被加載進(jìn)全局環(huán)境中,同時也提供了一些操作這個環(huán)境的函數(shù)。你可以使用 load(或者 loadfile)在加載一個代碼塊時指定不同的環(huán)境。(在 C 代碼中,你必須在加載代碼塊后通過改變第一個上值(upvalue)來實現(xiàn)環(huán)境的改變。)如果你改變了 Lua表中的全局環(huán)境(通過 C 代碼或調(diào)試庫),那么之后加載的代碼塊將會得到一個新的環(huán)境。之
35、前加載的代碼塊不受影響,它仍然使用之前的_ENV 變量。此外,變量_G(儲存在原先的全局環(huán)境中)從來被 Lua 更新。2.3 - 錯誤處理因為 Lua 是一種可擴展的語言,它的所有行為都是通過主程序調(diào)用 Lua 庫函數(shù)來開始的(參考 lua_pcall)。在編譯或運行 Lua 代碼時,只要有錯誤發(fā)生,那么會交回給主程序以采取合適的措施(比如打印一個錯誤信息)。權(quán)就Lua 代碼通過調(diào)用 error 函數(shù)可以產(chǎn)生一個錯誤信息。如果你想要捕獲這些錯誤,那么你可以使用 pcall 或 xpcall 在保護模式下調(diào)用函數(shù)。只要發(fā)生了錯誤,那么一個帶有相關(guān)信息的錯誤對象(也可以叫錯誤信息)就會被拋出。 L
36、ua 代碼只能產(chǎn)生攜帶字符串信息的錯誤對象,但主程序可以產(chǎn)生攜帶任何類型信息的錯誤對象。當(dāng)你使用 xpcall 或 lua_pcall 時,你可以指定一個消息處理函數(shù),當(dāng)錯誤發(fā)生時會調(diào)用該函數(shù)。這個函數(shù)處理原始的錯誤信息并返回處理后的錯誤信息。它在棧展開之前被調(diào)用,所以它可以收集到的與錯誤相關(guān)的信息,比如檢查調(diào)用棧并創(chuàng)建?;厮荨_@個處理函數(shù)也是在保護模式下調(diào)用的,所以當(dāng)這個處理函數(shù)本身也有錯誤產(chǎn)生時,也會調(diào)用它自身。如果因此出現(xiàn)了死循環(huán),那么 Lua 會在一定的循環(huán)次數(shù)后返回合適的錯誤消息。2.4 - 元表與元方法Lua 中的每一個值都可以綁定一個元表。這個元表是一個普通的 table,它可以
37、定義與該值相關(guān)的某些操作。你可以通過設(shè)置元表中特定域的值來改變 Lua 值的行為。比如當(dāng)一個非數(shù)字型的值作為加法操作的操作數(shù)時,Lua 會檢查該值是否綁定了元表并且元表設(shè)置了域“ add”的值為一個函數(shù),如果是,那么 Lua 就會調(diào)用這個函數(shù)來進(jìn)行該值的加法操作。元表中的鍵的名字由它對應(yīng)的名得來;對應(yīng)的值叫做元方法。在上面的例子中,事件是“add”,元方法就是進(jìn)行加法操作時調(diào)用的函數(shù)。你可以使用 getmetatable 函數(shù)來某個值是否綁定了元表。你可以使用 setmetatalbe 函數(shù)來綁定 table 的元表。你不能在 Lua 代碼中改變其它數(shù)據(jù)類型的元表(除非使用調(diào)試庫);你只能使用
38、 C API 來實現(xiàn)這個目的。每個 Table 和 full userdata 類型的值都可以有單獨的元表(但多個 table 和 userdata可以共享一個元表)。其它的每一種類型對應(yīng)地只能綁定一個元表。也就是說,所有的數(shù)字 類型只能綁定同一個元表,所有的字符串類型只能綁定同一個元表,等等。除了字符串類型的值默認(rèn)有一個元表外(參考 6.4),其它的值默認(rèn)是沒有元表的。一個元表了一個對象的算術(shù)、比較、連接,取長度操作和索引操作的行為。元表也可以定義一個在 userdata 或 table 被回收時調(diào)用的函數(shù)。當(dāng) Lua 在對一個值進(jìn)行這些操作時,它會檢查這個值是否有元表及元表中是否有對應(yīng)的。
39、如果有,那對應(yīng)的元方法就了 Lua 如何處理這些操作。元表可以接下來的這些操作。每個操作都被對應(yīng)的名字所標(biāo)識。每個操作在元表中對應(yīng)的鍵名以兩個下劃線(“ ”)作為前綴;舉個例子,“add”操作對應(yīng)的鍵名為“ add”。Lua 函數(shù)可以很好地描述這些操作在 Lua 的解釋器中是如何運行的。下面的 Lua 代碼僅僅是用來演示說明的,真正的行為是在解釋器中硬編碼的,它比下面的模擬效率更高。在下 面的描述中,所有的函數(shù)(rawget,tonumber 等等)都在 6.1 章節(jié)中有說明。特別說明一下,為了一個指定對象的元方法,我們使用下面的表達(dá)式:這個可以解釋為:這意味著元方法并觸發(fā)別的元方法,并且一個
40、沒有綁定元表的對象的元方法時出錯(會返回 nil)。對于一元操作符-和#,調(diào)用元方法時,函數(shù)的第二個參數(shù)是沒有意義的,保留它僅僅是為了方便 Lua 的內(nèi)部實現(xiàn),在以后的版本中它有可能被刪除,所以在下面的偽代碼中現(xiàn)這個參數(shù)。(大部分情況下,使用第二個參數(shù)是不適合的)出·"add": + (加法操作)下面定義的函數(shù) getbinhandler 模擬了 Lua 是如何選擇二元操作符的元方法的。首先判斷第一個操作數(shù),如果它沒有定義元方法再第二個操作數(shù)有沒有定義元方法。使用這個函數(shù),兩個操作數(shù) op1和 op2相加的行為如下:function add_event (op1,
41、 op2)local o1, o2 = tonumber(op1), tonumber(op2)if o1 and o2 then- op1 和 op2 都是數(shù)字類型?function getbinhandler (op1, op2, event)return metatable(op1)event or metatable(op2)event endrawget(getmetatable(obj) or , event)metatable(obj)event·····"sub":"mul":"
42、div":-*/(減法操作)行為和加法操作類似。(乘法操作)行為和加法操作類似。(除法操作)行為和加法操作類似。"mod": %(求余操作)行為和加法操作類似。它的原始操作是 o1 - floor(o1/o2)*o2。"pow": (求冪操作)行為和加法操作類似。它的原始操作是 pow 函數(shù)(來自 C的數(shù)學(xué)庫)。·"unm":-(一元操作符-)·"concat": . (連接操作符)function concat_event (op1, op2)if (type(op1) = &quo
43、t;string" or type(op1) = "number") and (type(op2) = "string" or type(op2) = "number") then return op1 . op2- 原始的字符串連接操作elselocal h = getbinhandler(op1, op2, " concat")function unm_event (op) local o = tonumber(op)if o then- 數(shù)字類型的操作數(shù)?return -o- '-'
44、 原始的負(fù)號操作else- 操作數(shù)不是數(shù)字類型- 嘗試它的元方法 local h = metatable(op). unm if h then- 調(diào)用元方法return (h(op)else- 找不到元方法,默認(rèn)處理error(···) endend endreturn o1 + o2- 這里的'+'表示原始的加法操作else- 至少有一個操作數(shù)不是數(shù)字類型local h = getbinhandler(op1, op2, " add") if h then- 調(diào)用它的元方法return (h(op1, op2)else- 找不
45、到元方法,默認(rèn)處理error(···) endend end·"len": # (取長度操作符)table 的求長度操作參考 3.4.6。·"eq": = (相等比較操作符)函數(shù) getequalhandler 模擬了 Lua 是怎么選擇比較操作符的元方法的。只有當(dāng)兩個待比較的數(shù)值它們的類型相同,且類型為 table 或 fulluserdata,且 eq 元方法也相同時,getequalhandler 才返回 eq 的值作為比較操作符的元方法。相等比較的實現(xiàn)如下:function eq_event (o
46、p1, op2)function getequalhandler (op1, op2) if type(op1) = type(op2) or(type(op1) = "table" and type(op1) = "userdata") then return nil- 不同的值endlocal mm1 = metatable(op1). eq local mm2 = metatable(op2). eqif mm1 = mm2 then return mm1 else return nil end endfunction len_event (op)
47、if type(op) = "string" thenreturn strlen(op)- 原始的字符串求長度操作elselocal h = metatable(op). len if h thenreturn (h(op)- 調(diào)用元方法elseif type(op) = "table" thenreturn #op- 原始的 table 求長度操作else- 找不到元方法,默認(rèn)出錯處理error(···) endend endif h thenreturn (h(op1, op2) elseerror(·
48、3;·) endend end注意返回的結(jié)果總是布爾型的。·"lt": < (小于比較操作符)注意返回的結(jié)果總是布爾型的。·"le": <= (小于等于比較操作符)function le_event (op1, op2)if type(op1) = "number" and type(op2) = "number" then return op1 <= op2- 數(shù)字類型比較elseif type(op1) = "string" and type(
49、op2) = "string" then return op1 <= op2- 按字典中的順序比較elselocal h = getbinhandler(op1, op2, " le") if h thenreturn not not h(op1, op2) elseh = getbinhandler(op1, op2, " lt")function lt_event (op1, op2)if type(op1) = "number" and type(op2) = "number" th
50、en return op1 < op2- 數(shù)字類型比較elseif type(op1) = "string" and type(op2) = "string" then return op1 < op2- 按字典中的順序比較elselocal h = getbinhandler(op1, op2, " lt") if h thenreturn not not h(op1, op2) elseerror(···) endend endif op1 = op2 then- 原始相等?(即 op1
51、和 op2 是同一個對象)return true- 值相等end- 嘗試使用元方法local h = getequalhandler(op1, op2) if h thenreturn not not h(op1, op2) elsereturn false endend注意當(dāng)沒有定義“l(fā)e”這個元方法時,Lua 假設(shè) a <= b 等于 not(b < a)并使用“l(fā)t”。和其它比較操作一樣,返回結(jié)果總是布爾型的。來·"index":索引操作。當(dāng)使用一個不存于 table 中的鍵去索引 table 中的內(nèi)容時會嘗試調(diào)用此元方法。(當(dāng)索引操作作用于的對
52、象不是一個 table 時,那么所有鍵都是不存在的,所以元方法一定會被嘗試調(diào)用。)·"newindex": table 賦值操作 tablekey= value。使用一個不存在于 table 中的鍵來給 table 中的域賦值時會嘗試調(diào)用此元方法。function settable_event (table, key, value) local hif type(table) = "table" then local v = rawget(table, key)- 如果鍵存在,那就做原始賦值function gettable_event (ta
53、ble, key) local hif type(table) = "table" then local v = rawget(table, key)- 如果鍵存在,返回原始的值if v = nil then return v end h = metatable(table). index if h = nil then return nil endelseh = metatable(table). index if h = nil thenerror(···) endendif type(h) = "function" t
54、henreturn (h(table, key)- 調(diào)用元方法else return hkey- 或者把元方法當(dāng)作一個 table 來使用end endif h thenreturn not h(op2, op1) elseerror(···) endend endend·"call":當(dāng) Lua 調(diào)用一個值的時候被調(diào)用。2.5 -回收Lua 對內(nèi)存進(jìn)行自動管理。這意味著你既不需要擔(dān)心內(nèi)存分配的問題,也不需要擔(dān)心內(nèi)存的問題。Lua 通過回收器回收那些已經(jīng)死了的數(shù)據(jù)對象(即 Lua 不可能再到的對象)從而實現(xiàn)內(nèi)存的自動管理。Lua 用到
55、的所有內(nèi)存都會被自動管理,包括字符串,table,userdata,函數(shù),線程,內(nèi)部結(jié)構(gòu)等等。Lua 實現(xiàn)的是一個增量式的標(biāo)記-清除回收器。它使用兩個數(shù)值來回收循環(huán)的行為:“暫?!保╣arbage-collector pause)和“步長”(garbage-collector step multiplier)。它們的都是百分一(比如值 100 在內(nèi)部表示為 1)。“暫?!被厥掌髟陂_始新一輪回收前要等待多久。數(shù)值越大表示回收器工作越不積極。數(shù)值小于 100 表示回收器從不等待,即結(jié)束一輪回收后立刻開始下一輪。數(shù)值等于 200 表示回收器會在內(nèi)存占用量為之前的 2 倍時開始新一輪的回收?!安介L”了內(nèi)存的回收速度,它與內(nèi)存的分配速度有關(guān)。數(shù)值越大,回收器工作越積極,但同時也
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球反流檢測設(shè)備行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國搖擺式生物工藝容器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025中餐館租賃合同
- 2025有關(guān)續(xù)簽勞動合同程序介紹
- 訂車協(xié)議合同
- 2025空調(diào)安裝工合同范文
- 企業(yè)信用貸款合同范本
- 活動中心電冰箱采購合同
- 2025年新世紀(jì)版選修4地理上冊階段測試試卷含答案
- 勞務(wù)派遣用工合同
- 搞笑小品劇本《大城小事》臺詞完整版
- 物業(yè)服務(wù)和后勤運輸保障服務(wù)總體服務(wù)方案
- 人大代表小組活動計劃人大代表活動方案
- 《大模型原理與技術(shù)》全套教學(xué)課件
- 2023年護理人員分層培訓(xùn)、考核計劃表
- 《銷售培訓(xùn)實例》課件
- T-BJCC 1003-2024 首店、首發(fā)活動、首發(fā)中心界定標(biāo)準(zhǔn)
- 外科手術(shù)及護理常規(guī)
- 鐵嶺衛(wèi)生職業(yè)學(xué)院單招參考試題庫(含答案)
- 出口潛力分析報告
- 大美陜西歡迎你-最全面的陜西省簡介課件
評論
0/150
提交評論