1. 程式人生 > >Lua 模組與包

Lua 模組與包

模組類似於一個封裝庫,從 Lua 5.1 開始,Lua 加入了標準的模組管理機制,可以把一些公用的程式碼放在一個檔案裡,以 API 介面的形式在其他地方呼叫,有利於程式碼的重用和降低程式碼耦合度。

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 宣告為程式塊的區域性變數,即表示一個私有函式,因此是不能從外部訪問模組裡的這個私有函式,必須通過模組裡的公有函式來呼叫.

require 函式

Lua提供了一個名為require的函式用來載入模組。要載入一個模組,只需要簡單地呼叫就可以了。例如:

require("<模組名>")

或者

require "<模組名>"

執行 require 後會返回一個由模組常量或函式組成的 table,並且還會定義一個包含該 table 的全域性變數。

-- test_module.lua 檔案
-- module 模組為上文提到到 module.lua
require("module")
 
print(module.constant)
 
module.func3()

以上程式碼執行結果為:

這是一個常量
這是一個私有函式!

或者給載入的模組定義一個別名變數,方便呼叫:

-- test_module2.lua 檔案
-- module 模組為上文提到到 module.lua
-- 別名變數 m
local m = require("module")
 
print(m.constant)
 
m.func3()

以上程式碼執行結果為:

這是一個常量
這是一個私有函式!

載入機制

對於自定義的模組,模組檔案不是放在哪個檔案目錄都行,函式 require 有它自己的檔案路徑載入策略,它會嘗試從 Lua 檔案或 C 程式庫中載入模組。

require 用於搜尋 Lua 檔案的路徑是存放在全域性變數 package.path 中,當 Lua 啟動後,會以環境變數 LUA_PATH 的值來初始這個環境變數。如果沒有找到該環境變數,則使用一個編譯時定義的預設路徑來初始化。

當然,如果沒有 LUA_PATH 這個環境變數,也可以自定義設定,在當前使用者根目錄下開啟 .profile 檔案(沒有則建立,開啟 .bashrc 檔案也可以),例如把 "~/lua/" 路徑加入 LUA_PATH 環境變數裡:

#LUA_PATH
export LUA_PATH="~/lua/?.lua;;"

檔案路徑以 ";" 號分隔,最後的 2 個 ";;" 表示新加的路徑後面加上原來的預設路徑。

接著,更新環境變數引數,使之立即生效。

source ~/.profile

這時假設 package.path 的值是:

/Users/dengjoe/lua/?.lua;./?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua

那麼呼叫 require("module") 時就會嘗試開啟以下檔案目錄去搜索目標。

/Users/dengjoe/lua/module.lua;
./module.lua
/usr/local/share/lua/5.1/module.lua
/usr/local/share/lua/5.1/module/init.lua
/usr/local/lib/lua/5.1/module.lua
/usr/local/lib/lua/5.1/module/init.lua

如果找過目標檔案,則會呼叫 package.loadfile 來載入模組。否則,就會去找 C 程式庫。

搜尋的檔案路徑是從全域性變數 package.cpath 獲取,而這個變數則是通過環境變數 LUA_CPATH 來初始。

搜尋的策略跟上面的一樣,只不過現在換成搜尋的是 so 或 dll 型別的檔案。如果找得到,那麼 require 就會通過 package.loadlib 來載入它。

C 包

Lua和C是很容易結合的,使用C為Lua寫包。

與Lua中寫包不同,C包在使用以前必須首先載入並連線,在大多數系統中最容易的實現方式是通過動態連線庫機制。

Lua在一個叫loadlib的函式內提供了所有的動態連線的功能。這個函式有兩個引數:庫的絕對路徑和初始化函式。所以典型的呼叫的例子如下:

local path = "/usr/local/lua/lib/libluasocket.so"
local f = loadlib(path, "luaopen_socket")

loadlib函式載入指定的庫並且連線到Lua,然而它並不開啟庫(也就是說沒有呼叫初始化函式),反之他返回初始化函式作為Lua的一個函式,這樣我們就可以直接在Lua中呼叫他。

如果載入動態庫或者查詢初始化函式時出錯,loadlib將返回nil和錯誤資訊。我們可以修改前面一段程式碼,使其檢測錯誤然後呼叫初始化函式:

local path = "/usr/local/lua/lib/libluasocket.so"
-- 或者 path = "C:\\windows\\luasocket.dll",這是 Window 平臺下
local f = assert(loadlib(path, "luaopen_socket"))
f()  -- 真正開啟庫

一般情況下我們期望二進位制的釋出庫包含一個與前面程式碼段相似的stub檔案,安裝二進位制庫的時候可以隨便放在某個目錄,只需要修改stub檔案對應二進位制庫的實際路徑即可。

將stub檔案所在的目錄加入到LUA_PATH,這樣設定後就可以使用require函式載入C庫了。

相關推薦

Lua模組

    模組類似於一個封裝庫,從Lua 5.1開始,Lua加入了標準的模組管理機制,可以把一些公用的程式碼放在一個檔案裡,以API介面的形式在其他地方呼叫,有利於程式碼的重用和降低程式碼耦合度。   

Step By Step(Lua模組)

    從Lua 5.1開始,我們可以使用require和module函式來獲取和建立Lua中的模組。從使用者的角度來看,一個模組就是一個程式庫,可以通過require來載入,之後便得到一個型別為table的全域性變數。此時的table就像名字空間一樣,可以訪問其中的函式

Lua 模組

模組類似於一個封裝庫,從 Lua 5.1 開始,Lua 加入了標準的模組管理機制,可以把一些公用的程式碼放在一個檔案裡,以 API 介面的形式在其他地方呼叫,有利於程式碼的重用和降低程式碼耦合度。 Lua 的模組是由變數、函式等已知元素組成的 table,因此建立一個模組很

Lua學習筆記--模組

學習完了函式,那麼,一堆函式就成了一個模組,一堆模組就是一個包。今天來學習一下怎麼寫一個模組和怎麼呼叫模組。 一.簡介 Lua的感覺就是簡潔,自由,一個萬能的table可以搞定所有的事情。Lua從5.1開始提供了require(用於載入模組)和module(用於建立模組)

lua指令碼學習15 模組

Lua 模組與包 模組類似於一個封裝庫,從 Lua 5.1 開始,Lua 加入了標準的模組管理機制,可以把一些公用的程式碼放在一個檔案裡,以 API 介面的形式在其他地方呼叫,有利於程式碼的重用和降低程式碼耦合度。 Lua 的模組是由變數、函式等已知元素組成的 t

模組之間的呼叫

一. 模組 定義: 如果你從 Python 直譯器退出再進入,那麼你定義的所有的方法和變數就都消失了。為此 Python 提供了一個辦法,把這些定義存放在檔案中,為一些指令碼或者互動式的直譯器例項使用,這個檔案被稱為模組。 模組可以分為自定義模組、內建模組和第三方模組 1.內建模組 2.第三方模組

Day8--模組

模組的概念 在計算機程式的開發過程中,隨著程式程式碼越寫越多,在一個檔案裡程式碼就會越來越長,越來越不容易維護。 為了編寫可維護的程式碼,我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的程式碼就相對較少,很多程式語言都採用這種組織程式碼的方式。在Python中,一個.py檔案就稱之為一個模組

python模組揭祕

python模組揭祕 簡介 模組是最高級別的程式組織單元,它將程式程式碼和資料封裝起來以便重用。類似於c語言中include進來的標頭檔案。在python中,每一個檔案就是一個模組,並且模組匯入其它模組之後就可以使用匯入模組定義的變數名。 為什麼引入

node.js學習筆記——模組

1.模組 1.1 模組概述 在node中,一個檔案就是一個模組,每個模組都有自己的作用域。 Node中模組分為兩類:一類是Node提供的模組,稱為核心模組;另一類是使用者編寫的模組,稱為檔案模組。 核心模組在node原始碼的編譯過程中就編譯進了二進位制執行檔案

Python基礎之(模組

一、什麼是模組 模組就是一組功能的集合體,我們的程式可以匯入模組來複用模組的功能 在python中,模組的使用方式都是一樣的,但其實細說的話,模組可以分為四個通用類別:  使用python編寫的程式碼(.py檔案) 已被編譯為共享庫或DLL的C或C++擴充套件 包好一組模組的包 使用C

Python 中的黑暗角落(三):模組

如果你用過 Python,那麼你一定用過 import 關鍵字載入過各式各樣的模組。但你是否熟悉 Python 中的模組與包的概念呢?或者,以下幾個問題,你是否有明確的答案? 什麼是模組?什麼又是包?from matplotlib.ticker import Format

python筆記6 模組 程式開發規範

模組與包 python 模組首引用載入到記憶體,如果再次引用此模組,直接從記憶體中讀取. python檔案分為:執行檔案(直譯器執行的檔案),被引用檔案(import) 模組引用一共發生了3件事: 1.他在記憶體中開闢了以模組名命名的記憶體空間 2.你模組檔案的所有內容都載入到了記憶體. 3.通過

草根學Python(八) 模組

前言 目錄 一、Python 模組簡介 在開發過程中,隨著程式程式碼越寫越多,在一個檔案裡程式碼就會越來越長,越來越不容易維護。 為了編寫可維護的程式碼,我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的程式碼就相對較少,很多

python 模組的匯入

一、模組 何為模組? 模組是最高級別的程式組織單元;在python中,模組一般是python或C或Java等語言編寫的擴充套件檔案,這個擴充套件檔案可以被匯入使用。 為何使用模組? 模組首先是一個檔案,這個檔案可以在多種環境下任意次數地重新載入和重新執行,這就是說,模組可被重用;其次,模組作為pyth

Python的學習之旅———模組的使用 常用模組

一:import 匯入模組,只會在第一次匯入時執行原始檔的程式碼 如果模組已經載入到記憶體了,下一次匯入直接引用記憶體中匯入的結果 eval:提取字串內的表示式執行,然後返回執行結果 import 匯入檔案都做了哪些事? 1 以原始檔為準產生一個名稱空間2 以剛剛產生

lua 13 模組(類似class)

轉自: http://www.runoob.com/lua/lua-modules-packages.html   模組類似於一個封裝庫,從 Lua 5.1 開始,Lua 加入了標準的模組管理機制,可以把一些公用的程式碼放在一個檔案裡,以 API 介面的形式在其他地方呼叫,有利於程式碼的重用和

模組

function Module(){var something = "cool";var another = [1,2,3];function doSomething(){console.log( something );}function doAnother(){con

Lua中的模組module函式

這篇文章主要介紹了Lua中的模組(module)和包(package)詳解,本文講解了require函式、寫一個模組、package.loaded、module函式等內容.    從Lua5.1版本開始,就對模組和包添加了新的支援,可是使用require和module來定義和

Python---模組本質,匯入方法,優化,的匯入

1.模組模組的本質:是一個能實現某種功能的Python檔案。由於已經封裝好載入進Python app中,需要時直接匯入,所以又名庫。模組的匯入方法:(1)匯入1個module    import  module_name                           

Lua筆記8-模組

從Lua5.1版本開始,就對模組和包添加了新的支援,可是使用require和module來定義和使用模組和包。require用於使用模組,module用於建立模組。簡單的說,一個模組就是一個程式庫,可以通過require來載入。然後便得到了一個全域性變數,表示一個table