佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Lua的函數(shù)環(huán)境、包實(shí)例講解

Lua的函數(shù)環(huán)境、包實(shí)例講解

熱門標(biāo)簽:網(wǎng)站排名優(yōu)化 Linux服務(wù)器 服務(wù)外包 AI電銷 地方門戶網(wǎng)站 鐵路電話系統(tǒng) 百度競價排名 呼叫中心市場需求

復(fù)制代碼 代碼如下:

function foo()
   print(g or "No g defined!")
end
foo()
setfenv(foo, { g = 100, print = print }) --設(shè)置foo的環(huán)境為表{ g=100, ...}
foo()
print(g or "No g defined!")
--No g defined!
--100
--No g defined!

定義:函數(shù)環(huán)境就是函數(shù)在執(zhí)行時所見的全局變量的集合,以一個表來承載。

說明:每個函數(shù)都可以有自己的環(huán)境,可以通過setfenv來顯示的指定一個函數(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被指定了一個環(huán)境 { g = 100, print = print }。這個環(huán)境定義了(全局)變量g,以及打印函數(shù)print,因此第二次執(zhí)行foo,g的值就是100。但是在定義函數(shù)foo的函數(shù)的環(huán)境下,g仍然是一個未定義的變量。

應(yīng)用:函數(shù)環(huán)境的作用很多,利用它可以實(shí)現(xiàn)函數(shù)執(zhí)行的“安全沙箱”;另外Lua的包的實(shí)現(xiàn)也依賴它。

復(fù)制代碼 代碼如下:

--mypack.lua:
module(..., package.seeall) --定義包
ver = "0.1 alpha"
function aFunInMyPack()
    print("Hello!")
end
_G.aFuncFromMyPack = aFunInMyPack

復(fù)制代碼 代碼如下:

--testP.lua:
pack = require "mypack" --導(dǎo)入包
print(ver or "No ver defined!")
print(pack.ver)
print(aFunInMyPack or "No aFunInMyPack defined!")
pack.aFunInMyPack()
print(aFuncFromMyPack or "No aFuncFromMyPack defined!")
aFuncFromMyPack()

復(fù)制代碼 代碼如下:

--執(zhí)行testP.lua結(jié)果
No ver defined!
0.1 alpha
No aFunInMyPack defined!
Hello!
function: 0068CB50
Hello!

定義:包是一種組織代碼的方式。

實(shí)現(xiàn)方式:一般在一個Lua文件內(nèi)以module函數(shù)開始定義一個包。module同時定義了一個新的包的函數(shù)環(huán)境,以使在此包中定義的全局變量都在這個環(huán)境中,而非使用包的函數(shù)的環(huán)境中。理解這一點(diǎn)非常關(guān)鍵。以前面的代碼為例, “module(..., package.seeall)”的意思是定義一個包,包的名字與定義包的文件的名字相同(除去文件名后綴,在前面的代碼中,就是“mypack”),并且在包的函數(shù)環(huán)境里可以訪問使用包的函數(shù)環(huán)境(比如,包的實(shí)現(xiàn)使用了print,這個變量沒有在包里定義,而是定義在使用包的外部環(huán)境中)。

使用方式:一般用require函數(shù)來導(dǎo)入一個包,要導(dǎo)入的包必須被置于包路徑(packagepath)上。包路徑可以通過package.path或者環(huán)境變量來設(shè)定。一般來說,當(dāng)前工作路徑總是在包路徑中。

您可能感興趣的文章:
  • 解決nginx+lua搭建文件上傳下載服務(wù)問題
  • Lua在windows下的安裝及環(huán)境配置
  • 安裝Nginx+Lua開發(fā)環(huán)境
  • Mac平臺中編譯安裝Lua運(yùn)行環(huán)境及Hello Lua實(shí)例
  • 解析Lua中的全局環(huán)境、包、模塊組織結(jié)構(gòu)
  • Lua在各個操作系統(tǒng)中的開發(fā)環(huán)境配置教程
  • linux系統(tǒng)安裝Nginx Lua環(huán)境
  • 如何使用Vim搭建Lua開發(fā)環(huán)境詳解

標(biāo)簽:湘潭 衡水 湖南 仙桃 蘭州 崇左 黃山 銅川

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua的函數(shù)環(huán)境、包實(shí)例講解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    瑞安市| 淅川县| 同心县| 南昌市| 临颍县| 洪湖市| 福清市| 伊金霍洛旗| 泸定县| 寿宁县| 泸西县| 濮阳市| 木兰县| 澜沧| 黑山县| 泸水县| 弋阳县| 昌图县| 吉隆县| 丹阳市| 霞浦县| 马龙县| 金塔县| 宁化县| 清苑县| 温州市| 那曲县| 环江| 略阳县| 湟中县| 安西县| 彭州市| 黑河市| 涟源市| 新宁县| 长沙县| 台中市| 五河县| 阿坝县| 平陆县| 广平县|