1.概述
當我們在全域性環境中定義變數時經常會有命名衝突,尤其是在使用一些庫的時候,變數宣告
可能會發生覆蓋,這時候就需要乙個非全域性的環境來解決這問題。setfenv函式可以滿足我們
的需求。
所謂函式的環境,其實乙個環境就是乙個表,該函式被限定為只能訪問該表中的域,或在函
數體內自己定義的變數。
1.1.定義
setfenv(f, table):設定乙個函式的環境
(1)當第乙個引數為乙個函式時,表示設定該函式的環境
(2)當第乙個引數為乙個數字時,為1代表當前函式,2代表呼叫自己的函式,3代表呼叫自己
的函式的函式,以此類推
2.例項
(1)下面這個例子,設定當前函式的環境為乙個空表,那麼在設定執行以後,來自全域性的print
函式將不可見,所以呼叫會失敗。
-- 乙個環境就是乙個表,該錶記錄了新環境能夠訪問的全部域
newfenv = {}
setfenv(1, newfenv)
print(1) -- attempt to call global `print' (a nil value)
(2)我們可以這樣繼承已有的域
a = 10
newfenv =
setfenv(1, newfenv)
_g.print(1) -- 1
_g.print(_g.a) -- 10
_g.print(a) -- nil 注意此處是nil,新環境沒有a域,但可以通過_g.a訪問_g的a域
(3)可以看到,新環境中可以訪問_g,但有一點就是_g中的所有函式必須手動呼叫,這樣其實
很不方便。我們可以使用metatable來對上述**進行改進:
-- 任何賦值操作都對新錶進行,不用擔心誤操作修改了全域性變數表。另外,你仍然可以通過_g修改全域性變數:
newfenv = {}
setmetatable(newfenv, )
setfenv(1, newfenv)
print(1) -- 1 新環境直接繼承了全域性環境的所有域,好處:可以不需要通過_g來手動呼叫
這樣,當訪問到函式中不存在的變數時,會自動在_g中查詢。對於當前函式和_g都存在的變數,可以通過是
否用_g顯示呼叫來區分,比如如果有兩個a,那麼_g.a表示繼承來的,a就是當前函式環境的。
另外,可以通過getfenv(f)函式檢視函式所處的環境,缺省會返回全域性環境_g。
Lua知識點 基礎 rawset
1.概述 rawset 2.例項 test.lua window window.prototype window.mt function window.new o setmetatable o window.mt return o endwindow.mt.index window.prototyp...
LUA入門基礎知識點
lua執行的每段 例如乙個源 檔案或在互動模式中輸入一行 都可以稱為乙個程式塊。乙個程式塊也就是一連串的語句或者是命令。另外和c不同的是,c中的沒行語句在結束的時候都要輸入英文符號的分好作為結束標誌,但是在lua中,幾條連續的lua語句之間並不需要分隔符,當然也可以出現。例如 a 1 b a 2 a...
初學Lua知識點
1.變數 變數沒有預定義的型別 每乙個變數都可能包含任一種型別的值 nillua 中特殊的型別 乙個全域性型別沒有被賦值以前預設值為 nil,給全域性變數付 nil可以刪除該變數 boolean兩個取值 false 和true.但 lua中所有值都可以作為條件 在控制結構的條件中除了 false 和...