定義:函數(shù)環(huán)境就是函數(shù)在執(zhí)行時(shí)所見的全局變量的集合,以一個(gè)表來承載。
說明:每個(gè)函數(shù)都可以有自己的環(huán)境,可以通過setfenv來顯示的指定一個(gè)函數(shù)的環(huán)境。如果不顯示的指定,函數(shù)的環(huán)境缺省為定義該函數(shù)的函數(shù)的環(huán)境。在前面的代碼中,函數(shù)foo的缺省環(huán)境里沒有定義變量g,因此第一次執(zhí)行foo, g為nil,表達(dá)式g or "No g defined!"的值就是"No g defined!"。隨后,foo被指定了一個(gè)環(huán)境 { g = 100, print = print }。這個(gè)環(huán)境定義了(全局)變量g,以及打印函數(shù)print,因此第二次執(zhí)行foo,g的值就是100。但是在定義函數(shù)foo的函數(shù)的環(huán)境下,g仍然是一個(gè)未定義的變量。
應(yīng)用:函數(shù)環(huán)境的作用很多,利用它可以實(shí)現(xiàn)函數(shù)執(zhí)行的“安全沙箱”;另外Lua的包的實(shí)現(xiàn)也依賴它。
包
定義:包是一種組織代碼的方式。
實(shí)現(xiàn)方式:一般在一個(gè)Lua文件內(nèi)以module函數(shù)開始定義一個(gè)包。module同時(shí)定義了一個(gè)新的包的函數(shù)環(huán)境,以使在此包中定義的全局變量都在這個(gè)環(huán)境中,而非使用包的函數(shù)的環(huán)境中。理解這一點(diǎn)非常關(guān)鍵。以前面的代碼為例, “module(..., package.seeall)”的意思是定義一個(gè)包,包的名字與定義包的文件的名字相同(除去文件名后綴,在前面的代碼中,就是“mypack”),并且在包的函數(shù)環(huán)境里可以訪問使用包的函數(shù)環(huán)境(比如,包的實(shí)現(xiàn)使用了print,這個(gè)變量沒有在包里定義,而是定義在使用包的外部環(huán)境中)。
使用方式:一般用require函數(shù)來導(dǎo)入一個(gè)包,要導(dǎo)入的包必須被置于包路徑(packagepath)上。包路徑可以通過package.path或者環(huán)境變量來設(shè)定。一般來說,當(dāng)前工作路徑總是在包路徑中。
標(biāo)簽:德宏 濰坊 天門 臺(tái)灣 儋州 天門 宣城 金昌
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua的函數(shù)環(huán)境、包實(shí)例講解》,本文關(guān)鍵詞 Lua,的,函數(shù),環(huán)境,包實(shí)例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。