W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
舊式的模塊定義方式是通過(guò) ?module("filename"[,package.seeall])*
? 來(lái)顯式聲明一個(gè)包,現(xiàn)在官方不推薦再使用這種方式。這種方式將會(huì)返回一個(gè)由 ?filename
?模塊函數(shù)組成的 ?table
?,并且還會(huì)定義一個(gè)包含該 table 的全局變量。
?module("filename", package.seeall)
?這種寫(xiě)法是不提倡的,官方給出了兩點(diǎn)原因:
package.seeall
? 這種方式破壞了模塊的高內(nèi)聚,原本引入 "filename" 模塊只想調(diào)用它的 foobar() 函數(shù),但是它卻可以讀寫(xiě)全局屬性,例如 ?"filename.os"
?。module
?函數(shù)壓棧操作引發(fā)的副作用,污染了全局環(huán)境變量。例如 ?module("filename")
? 會(huì)創(chuàng)建一個(gè) ?filename
?的 ?table
?,并將這個(gè) ?table
?注入全局環(huán)境變量中,這樣使得沒(méi)有引用它的文件也能調(diào)用 ?filename
?模塊的方法。比較推薦的模塊定義方法是:
-- square.lua 長(zhǎng)方形模塊
local _M = {} -- 局部的變量
_M._VERSION = '1.0' -- 模塊版本
local mt = { __index = _M }
function _M.new(self, width, height)
return setmetatable({ width=width, height=height }, mt)
end
function _M.get_square(self)
return self.width * self.height
end
function _M.get_circumference(self)
return (self.width + self.height) * 2
end
return _M
引用示例代碼:
local square = require "square"
local s1 = square:new(1, 2)
print(s1:get_square()) --output: 2
print(s1:get_circumference()) --output: 6
另一個(gè)跟 Lua 的 module 模塊相關(guān)需要注意的點(diǎn)是,當(dāng) lua_code_cache on 開(kāi)啟時(shí),require 加載的模塊是會(huì)被緩存下來(lái)的,這樣我們的模塊就會(huì)以最高效的方式運(yùn)行,直到被顯式地調(diào)用如下語(yǔ)句(這里有點(diǎn)像模塊卸載):
package.loaded["square"] = nil
我們可以利用這個(gè)特性代碼來(lái)做一些高階玩法,比如代碼熱更新等。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: