成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

luarequire與module-創(chuàng)新互聯(lián)

一、模塊機制module

創(chuàng)新互聯(lián)建站是一家專業(yè)提供柳江企業(yè)網(wǎng)站建設,專注與成都做網(wǎng)站、成都網(wǎng)站建設、成都外貿(mào)網(wǎng)站建設H5建站、小程序制作等業(yè)務。10年已為柳江眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設計公司優(yōu)惠進行中。

    1.什么是module

對于用戶來說,一個module相當于一個so庫。模塊的主要目標是實現(xiàn)代碼的共享。

    2.如何編寫module

lua是通過table來實現(xiàn)模塊的,典型的寫法如下。

local M = {}        ---- 通常是加local的,如果不加,則M默認注冊到_G中,require后,即使不return也可以直接使用M。加了local是局部變量,需要顯示的return一下。

M.print = function(...)

    print(...)

end

return M

二、require機制

    1.require實現(xiàn)原理:

function require(name)

    if not packge.loaded[name] then        ---- 避免重復加載

        local loader = findloader(name)        ---- 如果是so,就以loadlib方式加載文件,如果是lua文件,就以loadfile方式加載文件。

        if loader == nil then

            error("unable to load module " .. name)

        end

        package.loaded[name] = true         ---- 將模塊標記為以加載,我們有時候會看到require返回true的現(xiàn)象,是由于被調(diào)用的模塊,沒有顯示的執(zhí)行package.loaded[modname] = M或者給出return M這樣的返回值。

        local res = loader(name)        ---- require會以name作為入?yún)韴?zhí)行該文件,如果有返回結果,就將返回結果保存在package.loaded[name]中,如果沒有返回結果,就直接返回package.loaded[name]。如果我們在被調(diào)用的文件中直接寫明return 1。則調(diào)用者的require的返回結果就是1。但是只要我們顯示的在require文件中寫明了_G[modname] = M,我們?nèi)匀豢梢栽趓equire之后,直接使用M作為名字來調(diào)用,是由于將M加入到了_G中。

        if res ~= nil then

            package.loaded[name] = res

        end

    end

    return package.loaded[name]

end

    2.require實現(xiàn)解析:

  傳參: require會將模塊名作為參數(shù)傳遞給模塊

    返回值:如果一個模塊沒有返回值的話,require就會返回package.loaded[modulename]作為返回值。

------------------------example---------------------

舉例:

pa.lua:

local modname = ...

local M = {}

_G[modname] = M

package.loaded[modname] = M

function M.print_mob()

print(modname)

end

mob.lua:

require "pa"

pa.print_mob()

執(zhí)行結果:

lua mob.lua

pa

------------------------------------------------------------

分析:

pa.lua中的modname接收的是require傳遞過來的參數(shù),將其加入到全局環(huán)境變量_G中,相當于動態(tài)創(chuàng)建了一個modname的表(注意:表名的賦值實際上是引用,相當于C語言中的指針,即使是傳參也會有相同的效果)。我們經(jīng)常local m = require "mdname",實際上是將生成的表進行了重命名,但是本質上還是mdname這個表。

pa.lua中的return M我們沒有顯示聲明,由package.loaded[modulename]來代替,通過require實現(xiàn)機制可以看到,這時候返回值應該是true。

三、環(huán)境

lua用_G一張表保存了全局數(shù)據(jù)(變量,函數(shù)和表等)。

如上分析,我們定義一個module,如果不加local,則它是一個注冊在全局下的表。我們通過加local避免了它在污染全局表空間,只在本文件生效。如果我們沒有將其注冊到_G下,在其他文件是無法直接通過他的原始名字來訪問的。不便利的地方,每個函數(shù)前面都要帶M,M的下的函數(shù)相互訪問也要帶M頭。

解決方法:通過setfenv

local modname = ...

local M = {}

_G[modname] = M

package.loaded[modname] = M

setfenv(1, M)

后續(xù)的函數(shù)直接定義名字,因為他們的環(huán)境空間已經(jīng)由_G改為了M。

如果要使用全局函數(shù),則可以本地額外增加一條local _G = _G或者setmetatable(M, {__index = G})。

更好的方法是在setfenv之前將需要的函數(shù)都保存起來,local sqrt = math.sqrt

四、module函數(shù)

local M = {}

_G[modname] = M

package.loaded[modname] = M

<set for external access: eg setmetatable(M, {__index = _G})>

setfenv(1, M)

等同于module(modname)。

默認情況下,module不提供外部訪問,如果要訪問外部變量,兩種方法:

1.在聲明module之前,local 變量 = 外部變量

2.使用module(modname, package.seeall), 等價于setmetatable(M, __index = _G)

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

本文標題:luarequire與module-創(chuàng)新互聯(lián)
地址分享:http://jinyejixie.com/article36/cciopg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供云服務器、營銷型網(wǎng)站建設、Google、關鍵詞優(yōu)化、App設計自適應網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
庄河市| 蓬安县| 广宁县| 雅安市| 织金县| 淳安县| 绵竹市| 平远县| 包头市| 怀安县| 满洲里市| 惠东县| 云南省| 易门县| 垫江县| 安化县| 阜宁县| 西盟| 牟定县| 安阳县| 阳曲县| 大冶市| 交城县| 上犹县| 英超| 齐河县| 宣化县| 霞浦县| 始兴县| 高雄市| 克什克腾旗| 固阳县| 平度市| 怀化市| 新和县| 闽清县| 武城县| 万安县| 蓝山县| 六安市| 周口市|