天天看點

Lua進階(二)——函數環境、包

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

說明:每個函數都可以有自己的環境,可以通過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的包的實作也依賴它。

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

實作方式:一般在一個lua檔案内以module函數開始定義一個包。module同時定義了一個新的包的函數環境,以使在此包中定義的全局變量都在這個環境中,而非使用包的函數的環境中。了解這一點非常關鍵。以前面的代碼為例, “module(..., package.seeall)”的意思是定義一個包,包的名字與定義包的檔案的名字相同(除去檔案名字尾,在前面的代碼中,就是“mypack”),并且在包的函數環境裡可以通路使用包的函數環境(比如,包的實作使用了print,這個變量沒有在包裡定義,而是定義在使用包的外部環境中)。

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

繼續閱讀