麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

Lua的函數環境、包實例講解

2024-07-21 23:04:10
字體:
來源:轉載
供稿:網友

 

復制代碼 代碼如下:

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

 

定義:函數環境就是函數在執行時所見的全局變量的集合,以一個表來承載。

說明:每個函數都可以有自己的環境,可以通過setfenv來顯示的指定一個函數的環境。如果不顯示的指定,函數的環境缺省為定義該函數的函數的環境。在前面的代碼中,函數foo的缺省環境里沒有定義變量g,因此第一次執行foo, g為nil,表達式g or "No g defined!"的值就是"No g defined!"。隨后,foo被指定了一個環境 { g = 100, print = print }。這個環境定義了(全局)變量g,以及打印函數print,因此第二次執行foo,g的值就是100。但是在定義函數foo的函數的環境下,g仍然是一個未定義的變量。

應用:函數環境的作用很多,利用它可以實現函數執行的“安全沙箱”;另外Lua的包的實現也依賴它。

 

復制代碼 代碼如下:

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

復制代碼 代碼如下:

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

復制代碼 代碼如下:

--執行testP.lua結果
No ver defined!
0.1 alpha
No aFunInMyPack defined!
Hello!
function: 0068CB50
Hello!

 

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久青草免费视频 | hd性videos意大利复古 | 日韩欧美激情视频 | 91九色电影 | 99在线免费观看视频 | 视频一区二区三区在线播放 | 日日狠狠久久偷偷四色综合免费 | av成人免费观看 | 黄色美女免费 | 伊人99在线 | 久久国产精品免费视频 | 成人不卡一区二区 | 久久久一区二区三区精品 | 最新在线黄色网址 | 神马久久蜜桃 | 免费毛片播放 | 久久久久久久一区二区 | 亚洲国产高清一区 | 视频一区国产 | 色妹子久久 | 凹凸成人精品亚洲精品密奴 | 久久久久亚洲a | 4399一级成人毛片 | 爱逼av| 国内久久久久 | 免费观看高清视频网站 | 国产色视频一区 | 久久靖品 | 中文字幕一二三区芒果 | 777sesese | 精品一区二区三区免费 | 中文字幕在线观看成人 | 日本精品婷婷久久爽一下 | 韩毛片| 热久久成人 | 国产精品亚洲欧美一级在线 | 国产成人午夜精品 | 欧美一级久久 | www久久艹 | 老师你怎么会在这第2季出现 | 水卜樱一区二区av |