国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

Lua極簡入門指南(六):模塊

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

從用戶的角度來看,一個模塊能夠通過 require 加載并返回一個 table,模塊導出的接口都被定義在此 table 中(此 table 被作為一個 namespace)。所有的標準庫都是模塊。標準庫被預先加載了,就像這樣:

 

復制代碼 代碼如下:

math = require 'math'
string = require 'string'

 

require 函數

使用 require 函數加載模塊能夠避免多次重復加載模塊。加載一個模塊:

 

復制代碼 代碼如下:

require 'modulename'

 

模塊名(modulename)不那么準確的來說就是一個文件名(Lua 文件或者是 C 庫)。一個模塊被加載后會被緩存到 pacakge.loaded[modulename] 中。看一個例子:

 

復制代碼 代碼如下:

-- test.lua
print 'Hello World'

 

在 test.lua 的相同目錄下創建 main.lua 文件:

 

復制代碼 代碼如下:

-- main.lua
require 'test'

 

我們可以嘗試多次 require test.lua 文件,但最終只會輸出一次 Hello World。如果我們希望 require 重新加載模塊,那么可以清理 package.loaded:

 

復制代碼 代碼如下:

package.loaded[modulename] = nil

 

范例:

 

復制代碼 代碼如下:

require 'test'  --> Hello World
package.loaded.test = nil
require 'test'  --> Hello World

 

編寫模塊

編寫一個模塊很簡單,我們先創建一個 table 然后把需要導出的接口放入 table 中,最后返回此 table:

 

復制代碼 代碼如下:

-- test.lua
local exports = {}
 
function exports.foo()
    print 'Hello World'
end
 
return exports

 

模塊的返回值會被賦值給 package.loaded[modulename]:

 

復制代碼 代碼如下:

assert(require 'test' == package.loaded.test)

 

如果模塊不返回值,那么 package.loaded[modulename] 的值將為 true:

 

復制代碼 代碼如下:

-- 假定 test.lua 是一個空文件
local t = require 'test'
print(t)                    --> true
print(package.loaded.test)  --> true

 

更多的編寫模塊的方法見:http://lua-users.org/wiki/ModulesTutorial

查找模塊

如果一個模塊使用 Lua 編寫,那么將在 package.path 中查找,如果一個模塊使用 C 編寫,那么將在 package.cpath 中查找。package.path 和 package.cpath 是一個分號分隔的路徑列表,例如:

 

復制代碼 代碼如下:

C:/bin/lua/lua/?.lua;C:/bin/lua/lua/?/init.lua;C:/bin/lua/?.lua;C:/bin/lua/?/init.lua;./?.lua

 

每一個路徑都有一個 ?,真正的查找路徑是將 ? 替換為模塊名之后的路徑。

實際上,我們可以自定義查找模塊的規則(通過向 package.searchers 中添加適當的 searcher 函數實現),例如我們可以把所有模塊保存在一個加密并壓縮的 zip 文件中。

一個模塊命名為 mod.sub,其是 mod 的子模塊。在查找模塊時,mod.sub 中的 . 號會被轉換為目錄分隔符。假定路徑列表如下:

 

復制代碼 代碼如下:

C:/bin/lua/lua/?.lua;./?.lua

 

那么 require ‘a.b' 將嘗試打開文件:

 

復制代碼 代碼如下:

C:/bin/lua/lua/a/b.lua
./a/b.lua
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 哈巴河县| 灵璧县| 翁牛特旗| 平远县| 新田县| 太仆寺旗| 外汇| 同江市| 樟树市| 宜川县| 建瓯市| 锡林郭勒盟| 延津县| 高唐县| 东海县| 赣榆县| 西和县| 桦甸市| 徐水县| 揭东县| 来凤县| 东乌珠穆沁旗| 霍邱县| 武汉市| 盈江县| 永善县| 图木舒克市| 江阴市| 苗栗县| 西丰县| 万州区| 渭源县| 兴仁县| 广宁县| 安阳市| 天峻县| 昌图县| 萍乡市| 南陵县| 荣成市| 连平县|