好像有多種方式可以從另一個文件中訪問一個文件。爲什麼我會選擇另一種方法?loadfile,require和import之間有什麼區別
local a = loadfile('foo.lua')()
local b = require 'foo.lua'
local c = import 'foo.lua'
好像有多種方式可以從另一個文件中訪問一個文件。爲什麼我會選擇另一種方法?loadfile,require和import之間有什麼區別
local a = loadfile('foo.lua')()
local b = require 'foo.lua'
local c = import 'foo.lua'
在Lua標準庫中沒有import
函數。不適用於5.1,5.2或5.3。也許你正在考慮提供這種功能的其他代碼;你必須向該功能的提供者詢問它。
require
不加載.lua
文件;它加載模塊。究竟是什麼require
做的是defined by package.loaders
在5.1或package.searchers
在5.2/3。一個特定的模塊可能被實現爲.lua
文件,但它也可能是.dll/.so
。或者,如果模塊是應用程序內部的,則它可能是在編譯時間表中查找的名稱。或者它可以從互聯網上下載一些東西。或者任何東西,根據什麼loaders
/searchers
做。
默認loaders
/searchers
可以加載.lua
文件,但它們只能通過基於Lua搜索路徑的目錄進行搜索。此路徑由環境變量初始化,但用戶可以覆蓋它。
模塊命名約定也有一些子模塊的概念。你幾乎從不把「.lua」放在模塊名稱中。 require
加載模塊,而不是文件;加載的任何文件都是加載模塊的副作用。
哦,和require
緩存加載模塊。使用相同的模塊名稱再次調用它將簡單地返回先前加載的模塊。如果你想重新加載一個模塊......你不能。似乎沒有辦法強制模塊重新加載。
loadfile
從磁盤加載文件並將其編譯爲Lua塊。它使用C標準庫工具來進行文件加載,因此路徑的工作與Lua編譯的C庫實現一致。它返回加載的塊但不執行它。
我會補充說,只需要加載一個模塊一次,然後再調用時再次請求相同的參數,它會返回模塊的返回值(例如來自lua文件的返回值)或true。 loadfile改爲總是運行該文件。 – Rochet2
另外,'require'運行模塊一次。 'loadfile'不運行該文件。 – lhf