亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

解析Lua中的全局環境、包、模塊組織結構

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

模塊就是一個程序庫,而包是一系列模塊。Lua中可以通過require來加載模塊,然后得到一個全局變量表示一個table。Lua將其所有的全局變量保存在一個被稱為“環境”的常規table中。本文首先介紹環境的一些實用技術,然后介紹如何引用模塊及編寫模塊的基本方法。

1. 環境
Lua將環境table保存在一個全局變量_G中,可以對其訪問和設置。有時我們想操作一個全局變量,而它的名稱卻存儲在另一個變量中,或者需要通過運行時的計算才能得到,可以通過value = _G[varname]來獲得動態名字的全局變量。

關于“環境”的一大問題是它是全局的,任何對它的修改都會影響程序的所有部分。Lua 5允許每個函數擁有一個子集的環境來查找全局變量,可以通過setfenv來改變一個函數的環境,第一個參數若是1則表示當前函數,2則表示調用當前函數的函數(依次類推),第二個參數是一個新的環境table。

a = 1setfenv(1, {})print(a) -- 會報錯,print是一個nil。這是因為一旦改變環境,所有的全局訪問都會使用新的table

為了避免上述問題,可以使用setfenv(1, {_G = _G})將原來的環境保存起來,然后用_G.print來引用。另一種組裝新環境的方法是使用繼承,下面的代碼新環境從源環境中繼承了print和a,任何賦值都發生在新的table中。

a = 1local newgt = {}setmetatable(newgt, {__index = _G})setfenv(1, newgt)print(a)

2. 模塊與包
2.1 調用模塊

要調用模塊mod中的foo方法,可以用require函數來加載,如:

require "mod"mod.foo()-- 或者local m = require "mod"m.foo()

require函數的行為: (關于require使用的路徑查找策略不贅述)
在package.loaded這個table中檢查模塊是否已加載
=> 已加載,就返回相應的值(可見一個模塊只會加載一次)
=> 未加載,就試著在package.preload中查詢傳入的模塊名
===> 找到一個函數,就以該函數作為模塊的加載器
===> 找不到,則嘗試從Lua文件或C程序庫中加載模塊
=====> 找到Lua文件,通過loadfile來加載文件
=====> 找到C程序庫,通過loadlib來加載文件

2.2 使用環境

下面的代碼說明了如何用環境來創建一個復數(complex)模塊:

-- 模塊設置local modname = "complex"local M = {}_G[modname] = Mpackage.loaded[modname] = M-- 聲明模塊從外界所需的所有東西local _G = _G -- 保留舊環境的引用,使用時需要像_G.print這樣用local io = io-- 運行這句之后環境就變了setfenv(1, M)function new(r, i) return {r=r, i=i} endfunction add(c1, c2)  return new(c1.r + c2.r, c1.i + c2.i)end

這樣聲明函數add時,就成為了complex.add,調用同一模塊的其他函數也不需要加前綴。

2.3 module函數

Lua 5.1提供了一個新函數module,囊括了上面一系列定義環境的功能。在開始編寫一個模塊時,可以直接用module("modname", package.seeall)來取代前面的設置代碼。在一個模塊文件開頭有這句調用后,后續所有代碼都不需要限定模塊名和外部名字,同樣也不需要返回模塊table了。

2.4 子模塊與包

Lua支持具有層級的模塊名,用一個點來分隔名稱中的層級。例如一個模塊名為mod.sub,就是mod的一個子模塊。一個包(package)就是一個完整的模塊樹,它是Lua中發型的單位。注意,當搜索一個子模塊文件時,require會把點號當做目錄分隔符來搜索,也就是說調用require "a.b"會嘗試打開./a/b.lua,/usr/local/lua/a/b.lua,/usr/local/lua/a/b/init.lua。通過這種加載策略,可以將包的所有模塊組織到一個目錄中。

2.5 以自定義方式加載 lua 模塊
從 Lua 5.1 以后,Lua 有了標準的模塊管理庫。所以所有的模塊加載都是通過 require 來完成。 require 的設計是頗具擴展性的,它會從若干個定義好的 loader 中逐個嘗試加載新的模塊。系統庫中提供了四個 loader ,分別實現已加載模塊,Lua 模塊,和 C 擴展模塊(用了兩個 loader 來實現 C 擴展模塊的加載)。這些 loader 以 CFunction 的形式放在 require 的環境中的一個 table 里。

如果我們想改變 lua 模塊的加載形式,只需要替換或增加一個新的 loader 就可以了。

要做的只需要模仿 loadlib.c 中的 loader_Lua 函數做一個自己的實現,比如在我們的項目中,就允許從自定義格式數據包中,加載一個被加密過的 Lua 代碼文件。然后寫幾行 C 代碼,獲得 require 的環境(使用 lua_getfenv ),然后取出其中 "loaders" 這個 table ,把新的自定義 loader 插入到 index 2 的地方。

具體的代碼就不詳述了,仔細閱讀一下 ll_require 的實現(在 loadlib.c 中)就很容易明白。我們的整個工作從分析到實現沒有超過兩個小時,這真是得益于 Lua 良好的設計啊 :D 甚至如果你想從一個網絡連接的數據流中加載 Lua 模塊,或是通過 http/ftp 協議下載,也是行的通的吧。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线日韩精品视频| 亚洲人成在线观看| 国产精品视频自拍| 国产精品视频一区二区高潮| 日本一区二区在线播放| 亚洲精品一区av在线播放| 久久亚洲精品一区二区| 97视频com| 国产精品99蜜臀久久不卡二区| 日韩经典中文字幕| 久久久久久久久久久91| 一区二区三区久久精品| 欧美激情精品久久久久久蜜臀| 欧美成人第一页| 欧洲永久精品大片ww免费漫画| 秋霞成人午夜鲁丝一区二区三区| 成人妇女免费播放久久久| 国产精品美女久久久免费| 日韩在线高清视频| 色婷婷久久一区二区| 日韩电影免费观看在线| 国产精品视频一区国模私拍| 欧美激情精品久久久久久蜜臀| 激情亚洲一区二区三区四区| 久久夜色精品国产欧美乱| 国语自产偷拍精品视频偷| 亚洲精品视频中文字幕| 另类图片亚洲另类| 精品久久久国产| 久久夜精品香蕉| 欧美性videos高清精品| 亚洲精品一区二区网址| 九九九久久久久久| 国产美女91呻吟求| 国产福利视频一区| 九九热这里只有精品6| 欧美电影院免费观看| 日本中文字幕不卡免费| 高清欧美一区二区三区| 欧美在线观看www| 欧美巨乳在线观看| 久久九九亚洲综合| 国产精品第一第二| 日本不卡高字幕在线2019| 欧美日韩性生活视频| 91久久久久久| 国产成人啪精品视频免费网| 欧美在线性视频| 国产日韩欧美中文在线播放| 午夜精品一区二区三区在线播放| 亚洲人永久免费| 欧美第一黄网免费网站| 国产国语videosex另类| 欧美激情亚洲自拍| 国产区亚洲区欧美区| 欧美日韩免费观看中文| 欧美激情精品在线| 亚洲午夜精品久久久久久性色| 国产精品777| 日韩电影中文字幕在线| 91社区国产高清| 高清欧美性猛交| 成人精品视频99在线观看免费| 九九综合九九综合| 秋霞成人午夜鲁丝一区二区三区| 亚洲欧美在线一区二区| 狠狠躁夜夜躁人人躁婷婷91| 日韩一中文字幕| 国产97人人超碰caoprom| 尤物九九久久国产精品的分类| 97精品免费视频| 精品久久香蕉国产线看观看gif| 91丝袜美腿美女视频网站| 亚洲国产精品人久久电影| 亚洲欧洲在线视频| 欧美怡红院视频一区二区三区| 91啪国产在线| 成人h视频在线观看播放| 国产在线拍偷自揄拍精品| 精品无人区太爽高潮在线播放| 欧美激情乱人伦一区| 亚洲色图欧美制服丝袜另类第一页| 精品国内亚洲在观看18黄| 精品亚洲一区二区三区在线播放| 久久久成人av| 亚洲人午夜精品免费| 亚洲激情 国产| 欧美精品在线观看91| 欧美日韩一区二区在线播放| 91中文精品字幕在线视频| 国语自产精品视频在线看抢先版图片| 日日狠狠久久偷偷四色综合免费| 日韩视频免费看| 亚洲国产美女精品久久久久∴| 97色在线播放视频| 91豆花精品一区| 久久国产精品久久精品| 亚洲国产91精品在线观看| 亚洲高清av在线| 国产精品福利在线观看网址| 亚洲国产精品久久91精品| 92福利视频午夜1000合集在线观看| 国产精品偷伦一区二区| 国产精品国产亚洲伊人久久| 欧美午夜精品在线| 国产精品日韩欧美综合| 亚洲成人av中文字幕| 亚洲精品小视频在线观看| 久久人人爽人人爽人人片av高清| 色婷婷亚洲mv天堂mv在影片| 91香蕉国产在线观看| 国产精品一区二区电影| 日韩电影免费在线观看| 精品毛片网大全| 精品国产91久久久久久| 中日韩美女免费视频网站在线观看| 国产欧美在线视频| 国产欧美婷婷中文| 成人欧美一区二区三区在线湿哒哒| 国产精品专区h在线观看| 91在线视频导航| 亚洲丁香婷深爱综合| 欧美成人性生活| 韩曰欧美视频免费观看| 日本高清不卡的在线| 国产在线视频2019最新视频| 色综合久久久久久中文网| 亚洲精品福利视频| 91高清在线免费观看| 91久久精品美女| 欧美成人精品一区二区| 国产一区二区三区精品久久久| 久久综合九色九九| 欧美三级欧美成人高清www| 97久久伊人激情网| 国产精品一区二区三区免费视频| 国产免费一区二区三区香蕉精| 亚洲欧洲午夜一线一品| 国产精品综合网站| 播播国产欧美激情| 日韩精品极品毛片系列视频| 欧美一区二区三区……| 亚洲人成电影网站色| 成人黄色午夜影院| y97精品国产97久久久久久| 久久精品这里热有精品| 91精品国产91久久久久福利| 91国内精品久久| 欧美极品在线播放| 亚洲午夜av久久乱码| 91精品国产91| 久久国产精品久久久久| 国产91色在线|免| 久久久综合av| 亚洲国产成人精品女人久久久| 日韩av中文字幕在线| 亚洲福利视频专区| 久久av在线播放| 欧美成人激情在线| 日韩经典中文字幕| 色婷婷综合久久久久| 伊是香蕉大人久久| 亚洲自拍小视频免费观看| 美女国内精品自产拍在线播放|