多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

中國最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2

lua教程

Lua 模塊與包

閱讀 (2222)

Lua 模塊與包

模塊類似于一個封裝庫,從 Lua 5.1 開始,Lua 加入了標準的模塊管理機制,可以把一些公用的代碼放在一個文件里,以 API 接口的形式在其他地方調(diào)用,有利于代碼的重用和降低代碼耦合度。

Lua 的模塊是由變量、函數(shù)等已知元素組成的 table,因此創(chuàng)建一個模塊很簡單,就是創(chuàng)建一個 table,然后把需要導出的常量、函數(shù)放入其中,最后返回這個 table 就行。以下為創(chuàng)建自定義模塊 module.lua,文件代碼格式如下:

-- 文件名為 module.lua
-- 定義一個名為 module 的模塊
module = {}
 
-- 定義一個常量
module.constant = "這是一個常量"
 
-- 定義一個函數(shù)
function module.func1()
    io.write("這是一個公有函數(shù)!\n")
end
 
local function func2()
    print("這是一個私有函數(shù)!")
end
 
function module.func3()
    func2()
end
 
return module

由上可知,模塊的結(jié)構(gòu)就是一個 table 的結(jié)構(gòu),因此可以像操作調(diào)用 table 里的元素那樣來操作調(diào)用模塊里的常量或函數(shù)。

上面的 func2 聲明為程序塊的局部變量,即表示一個私有函數(shù),因此是不能從外部訪問模塊里的這個私有函數(shù),必須通過模塊里的公有函數(shù)來調(diào)用.


require 函數(shù)

Lua提供了一個名為require的函數(shù)用來加載模塊。要加載一個模塊,只需要簡單地調(diào)用就可以了。例如:

require("<模塊名>")

或者

require "<模塊名>"

執(zhí)行 require 后會返回一個由模塊常量或函數(shù)組成的 table,并且還會定義一個包含該 table 的全局變量。

-- test_module.php 文件
-- module 模塊為上文提到到 module.lua
require("module")
 
print(module.constant)
 
module.func3()

以上代碼執(zhí)行結(jié)果為:

這是一個常量
這是一個私有函數(shù)!

或者給加載的模塊定義一個別名變量,方便調(diào)用:

-- test_module2.php 文件
-- module 模塊為上文提到到 module.lua
-- 別名變量 m
local m = require("module")
 
print(m.constant)
 
m.func3()

以上代碼執(zhí)行結(jié)果為:

這是一個常量
這是一個私有函數(shù)!

加載機制

對于自定義的模塊,模塊文件不是放在哪個文件目錄都行,函數(shù) require 有它自己的文件路徑加載策略,它會嘗試從 Lua 文件或 C 程序庫中加載模塊。

require 用于搜索 Lua 文件的路徑是存放在全局變量 package.path 中,當 Lua 啟動后,會以環(huán)境變量 LUA_PATH 的值來初始這個環(huán)境變量。如果沒有找到該環(huán)境變量,則使用一個編譯時定義的默認路徑來初始化。

當然,如果沒有 LUA_PATH 這個環(huán)境變量,也可以自定義設置,在當前用戶根目錄下打開 .profile 文件(沒有則創(chuàng)建,打開 .bashrc 文件也可以),例如把 "~/lua/" 路徑加入 LUA_PATH 環(huán)境變量里:

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

文件路徑以 ";" 號分隔,最后的 2 個 ";;" 表示新加的路徑后面加上原來的默認路徑。

接著,更新環(huán)境變量參數(shù),使之立即生效。

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

那么調(diào)用 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

如果找過目標文件,則會調(diào)用 package.loadfile 來加載模塊。否則,就會去找 C 程序庫。

搜索的文件路徑是從全局變量 package.cpath 獲取,而這個變量則是通過環(huán)境變量 LUA_CPATH 來初始。

搜索的策略跟上面的一樣,只不過現(xiàn)在換成搜索的是 so 或 dll 類型的文件。如果找得到,那么 require 就會通過 package.loadlib 來加載它。


C 包

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

與Lua中寫包不同,C包在使用以前必須首先加載并連接,在大多數(shù)系統(tǒng)中最容易的實現(xiàn)方式是通過動態(tài)連接庫機制。

Lua在一個叫l(wèi)oadlib的函數(shù)內(nèi)提供了所有的動態(tài)連接的功能。這個函數(shù)有兩個參數(shù):庫的絕對路徑和初始化函數(shù)。所以典型的調(diào)用的例子如下:

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

loadlib函數(shù)加載指定的庫并且連接到Lua,然而它并不打開庫(也就是說沒有調(diào)用初始化函數(shù)),反之他返回初始化函數(shù)作為Lua的一個函數(shù),這樣我們就可以直接在Lua中調(diào)用他。

如果加載動態(tài)庫或者查找初始化函數(shù)時出錯,loadlib將返回nil和錯誤信息。我們可以修改前面一段代碼,使其檢測錯誤然后調(diào)用初始化函數(shù):

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

一般情況下我們期望二進制的發(fā)布庫包含一個與前面代碼段相似的stub文件,安裝二進制庫的時候可以隨便放在某個目錄,只需要修改stub文件對應二進制庫的實際路徑即可。

將stub文件所在的目錄加入到LUA_PATH,這樣設定后就可以使用require函數(shù)加載C庫了。

關(guān)閉
程序員人生
主站蜘蛛池模板: 国产亚洲3p一区二区三区 | 中文字幕在线资源 | 美国jizz| 极品久久 | 亚洲男女一区二区三区出奶水了 | 久久91亚洲精品久久91综合 | 日本xxwwwxxxx网站 | 日本欧美小视频 | 国产精品一国产精品 | 日本综合在线 | 亚洲小说区图片区另类春色 | 亚洲精品一区久久狠狠欧美 | 亚洲精品成人中文网 | 欧美一区二区三区在线视频 | 久久久久久综合一区中文字幕 | 成人a级高清视频在线观看 成人a毛片高清视频 | 国产精品1区 | 国产永久免费爽视频在线 | 欧美综合一区 | 亚洲最大中文字幕 | 泰国一级毛片aaa下面毛多 | 色网站欧美| 性欧美wideos| 伊人国产在线视频 | 欧美日韩久久中文字幕 | 桃花福利视频在线观看 | 日本特级毛片 | 啪啪网站视频 | 五月婷婷视频 | 国产一级一级片 | 午夜网站免费版在线观看 | 日本乱性| 九九精品成人免费国产片 | 99伊人精品 | 国产18视频 | 日韩欧美一二三 | 欧美日本一区亚洲欧美一区 | 99久久精品国产一区二区成人 | 日韩男人的天堂 | 日韩精品欧美精品中文精品 | 欧美一级视屏 |