Lua知識點 基礎 setfenv

2021-07-16 05:21:06 字數 1243 閱讀 9332

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 和...