0基礎lua學習(十二)Lua 模塊與包

Lua 模塊與包

模塊相似於一個封裝庫,從 Lua 5.1 開始,Lua 加入了標準的模塊管理機制,能夠把一些公用的代碼放在一個文件裏,以 API 接口的形式在其餘地方調用,有利於代碼的重用和下降代碼耦合度。web

Lua 的模塊是由變量、函數等已知元素組成的 table,所以建立一個模塊很簡單,就是建立一個 table,而後把須要導出的常量、函數放入其中,最後返回這個 table 就行。如下爲建立自定義模塊 module.lua,文件代碼格式以下:數組

-- 文件名爲 module.lua
-- 定義一個名爲 module 的模塊
module = {}

-- 定義一個常量
module.constant = "這是一個常量"

-- 定義一個函數
function module.func1()
    io.write("這是一個公有函數!\n")
end

local function func2()
    print("這是一個私有函數!")
end

function module.func3()
    func2()
end

return module

由上可知,模塊的結構就是一個 table 的結構,所以能夠像操做調用 table 裏的元素那樣來操做調用模塊裏的常量或函數。
上面的 func2 聲明爲程序塊的局部變量,即表示一個私有函數,所以是不能從外部訪問模塊裏的這個私有函數,必須經過模塊裏的公有函數來調用.ruby

require 函數svg

Lua提供了一個名爲require的函數用來加載模塊。要加載一個模塊,只須要簡單地調用就能夠了。例如:
require(「<模塊名>」)
或者
require 「<模塊名>」
執行 require 後會返回一個由模塊常量或函數組成的 table,而且還會定義一個包含該 table 的全局變量。函數

-- test_module.lua 文件
-- module 模塊爲上文提到到 module.lua
require("module")

print(module.constant)

module.func3()

以上代碼執行結果爲:
這是一個常量
這是一個私有函數!ui

或者給加載的模塊定義一個別名變量,方便調用:
– test_module2.lua 文件
– module 模塊爲上文提到到 module.lua
– 別名變量 m
local m = require(「module」)lua

print(m.constant)spa

m.func3()
以上代碼執行結果爲:
這是一個常量
這是一個私有函數!code

加載機制

咱們要研究lua的加載機制其實也是很簡單的xml

require("haha");

咱們加載一個不存在的模塊

報錯:
no field package.preload[‘haha’]
no file ‘.\haha.lua’
no file ‘C:\Program Files (x86)\Lua\5.1\lua\haha.lua’
no file ‘C:\Program Files (x86)\Lua\5.1\lua\haha\init.lua’
no file ‘C:\Program Files (x86)\Lua\5.1\haha.lua’
no file ‘C:\Program Files (x86)\Lua\5.1\haha\init.lua’
no file ‘C:\Program Files (x86)\Lua\5.1\lua\haha.luac’
no file ‘.\haha.dll’
no file ‘.\haha51.dll’
no file ‘C:\Program Files (x86)\Lua\5.1\haha.dll’
no file ‘C:\Program Files (x86)\Lua\5.1\haha51.dll’
no file ‘C:\Program Files (x86)\Lua\5.1\clibs\haha.dll’
no file ‘C:\Program Files (x86)\Lua\5.1\clibs\haha51.dll’
no file ‘C:\Program Files (x86)\Lua\5.1\loadall.dll’
no file ‘C:\Program Files (x86)\Lua\5.1\clibs\loadall.dll’

print("require查找的路徑")
print(package.path)
print("------------------")
print("require找不到的,就來c路徑下找")
print(package.cpath)

--當找到了這個文件之後,若是這個文件是一個Lua文件,
--它就經過loadfile來加載該文件;
--若是找到的是一個C程序庫,就經過loadlib來加載?
--loadfile和loadlib都只是加載了代碼,
--並無運行它們,爲了運行代碼,
--require會以模塊名做爲參數來調用這些代碼
相關文章
相關標籤/搜索