日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

设置函数环境——setfenv(转)

發(fā)布時間:2023/12/31 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设置函数环境——setfenv(转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  當我們在全局環(huán)境中定義變量時經(jīng)常會有命名沖突,尤其是在使用一些庫的時候,變量聲明可能會發(fā)生覆蓋,這時候就需要一個非全局的環(huán)境來解決這問題。setfenv函數(shù)可以滿足我們的需求。

  setfenv(f, table):設置一個函數(shù)的環(huán)境

  (1)當?shù)谝粋€參數(shù)為一個函數(shù)時,表示設置該函數(shù)的環(huán)境

  (2)當?shù)谝粋€參數(shù)為一個數(shù)字時,為1代表當前函數(shù),2代表調用自己的函數(shù),3代表調用自己的函數(shù)的函數(shù),以此類推

  所謂函數(shù)的環(huán)境,其實一個環(huán)境就是一個表,該函數(shù)被限定為只能訪問該表中的域,或在函數(shù)體內自己定義的變量。下面這個例子,設定當前函數(shù)的環(huán)境為一個空表,那么在設定執(zhí)行以后,來自全局的print函數(shù)將不可見,所以調用會失敗。

-- 一個環(huán)境就是一個表,該表記錄了新環(huán)境能夠訪問的全部域 newfenv = {} setfenv(1, newfenv) print(1) -- attempt to call global `print' (a nil value)

  我們可以這樣繼承已有的域:

a = 10 newfenv = {_G = _G} setfenv(1, newfenv) _G.print(1) -- 1 _G.print(_G.a) -- 10 _G.print(a) -- nil 注意此處是nil,新環(huán)境沒有a域,但可以通過_G.a訪問_G的a域

  可以看到,新環(huán)境中可以訪問_G,但有一點就是_G中的所有函數(shù)必須手動調用,這樣其實很不方便。我們可以使用metatable來對上述代碼進行改進:

-- 任何賦值操作都對新表進行,不用擔心誤操作修改了全局變量表。另外,你仍然可以通過_G修改全局變量: newfenv = {} setmetatable(newfenv, {__index = _G}) setfenv(1, newfenv) print(1) -- 1 新環(huán)境直接繼承了全局環(huán)境的所有域,好處:可以不需要通過_G來手動調用

  這樣,當訪問到函數(shù)中不存在的變量時,會自動在_G中查找。對于當前函數(shù)和_G都存在的變量,可以通過是否用_G顯示調用來區(qū)分,比如如果有兩個a,那么_G.a表示繼承來的,a就是當前函數(shù)環(huán)境的。

  另外,可以通過getfenv(f)函數(shù)查看函數(shù)所處的環(huán)境,默認會返回全局環(huán)境_G。

http://www.cnblogs.com/sifenkesi/p/3843348.html

總結

以上是生活随笔為你收集整理的设置函数环境——setfenv(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。