import与require的区别
載入一個模塊
import() 與 require() 功能相同,但具有一定程度的自動化特性。
假設我們有如下的目錄結構:
~~~
app/
app/classes/
app/classes/MyClass.lua
app/classes/MyClassBase.lua
app/classes/data/Data1.lua
app/classes/data/Data2.lua
~~~
MyClass 中需要載入 MyClassBase 和 MyClassData。如果用 require(),MyClass 內的代碼如下:
local MyClassBase = require("app.classes.MyClassBase")
local MyClass = class("MyClass", MyClassBase)
local Data1 = require("app.classes.data.Data1")
local Data2 = require("app.classes.data.Data2")
假如我們將 MyClass 及其相關文件換一個目錄存放,那么就必須修改 MyClass 中的 require() 命令,否則將找不到模塊文件。
而使用 import(),我們只需要如下寫:
local MyClassBase = import(".MyClassBase")
local MyClass = class("MyClass", MyClassBase)
local Data1 = import(".data.Data1")
local Data2 = import(".data.Data2")
當在模塊名前面有一個"." 時,import() 會從當前模塊所在目錄中查找其他模塊。因此 MyClass 及其相關文件不管存放到什么目錄里,我們都不再需要修改 MyClass 中的 import() 命令。這在開發一些重復使用的功能組件時,會非常方便。
我們可以在模塊名前添加多個"." ,這樣 import() 會從更上層的目錄開始查找模塊。
不過 import() 只有在模塊級別調用(也就是沒有將 import() 寫在任何函數中)時,才能夠自動得到當前模塊名。如果需要在函數中調用 import(),那么就需要指定當前模塊名:
~~~ lua
# MyClass.lua
# 這里的 ... 是隱藏參數,包含了當前模塊的名字,所以最好將這行代碼寫在模塊的第一行
local CURRENT_MODULE_NAME = ...
local function testLoad()
? ? local MyClassBase = import(".MyClassBase", CURRENT_MODULE_NAME)
? ? # 更多代碼
end
~~~
@param string moduleName 要載入的模塊的名字
@param [string currentModuleName] 當前模塊名
@return module
function import(moduleName, currentModuleName)
? ? local currentModuleNameParts
? ? local moduleFullName = moduleName
? ? local offset = 1
? ? while true do
? ? ? ? if string.byte(moduleName, offset) ~= 46 then -- .
? ? ? ? ? ? moduleFullName = string.sub(moduleName, offset)
? ? ? ? ? ? if currentModuleNameParts and #currentModuleNameParts > 0 then
? ? ? ? ? ? ? ? moduleFullName = table.concat(currentModuleNameParts, ".") .. "." .. moduleFullName
? ? ? ? ? ? end
? ? ? ? ? ? break
? ? ? ? end
? ? ? ? offset = offset + 1
? ? ? ? if not currentModuleNameParts then
? ? ? ? ? ? if not currentModuleName then
? ? ? ? ? ? ? ? local n,v = debug.getlocal(3, 1)
? ? ? ? ? ? ? ? currentModuleName = v
? ? ? ? ? ? end
? ? ? ? ? ? currentModuleNameParts = string.split(currentModuleName, ".")
? ? ? ? end
? ? ? ? table.remove(currentModuleNameParts, #currentModuleNameParts)
? ? end
? ? return require(moduleFullName)
end
轉載于:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/4527236.html
總結
以上是生活随笔為你收集整理的import与require的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu下eclipse新建项目没有
- 下一篇: seajs插件管理