Lua(模塊與包)

Lua 模塊的基本概念

Lua 中的模塊是一個由函數、變量組成的代碼庫,通常保存在獨立的 .lua 文件中。模塊通過 return 語句導出其內容,供其他腳本調用。模塊化設計可以提高代碼復用性,便于管理。

創建模塊

模塊通常以 .lua 文件形式存在,文件內通過 return 返回一個表(table),表中包含模塊的公開函數或變量。例如:

-- 文件名為 mymodule.lua
local M = {} -- 模塊表function M.add(a, b)return a + b
endfunction M.sub(a, b)return a - b
endreturn M -- 導出模塊

加載模塊

Lua 5.1 及以上版本使用 require 函數加載模塊。require 會搜索模塊路徑并執行文件,返回模塊導出的內容:

local mymodule = require("mymodule") -- 加載模塊
print(mymodule.add(1, 2)) -- 調用模塊函數

模塊搜索路徑

require 通過 package.pathpackage.cpath 確定搜索路徑。package.path 用于 .lua 文件,package.cpath 用于二進制模塊(如 .dll.so)。默認路徑包含當前目錄和 Lua 安裝路徑。

print(package.path) -- 查看 Lua 模塊搜索路徑
print(package.cpath) -- 查看二進制模塊搜索路徑

模塊的局部變量

模塊中未暴露的局部變量對外不可見,實現封裝:

local M = {}
local privateVar = 100 -- 局部變量,外部不可訪問function M.getPrivate()return privateVar
endreturn M

包管理工具

Lua 的包管理工具如 LuaRocks 可以安裝和管理第三方模塊。安裝命令示例:

luarocks install luasocket

模塊的緩存機制

require 會緩存已加載的模塊,避免重復加載。可以通過 package.loaded 查看或清除緩存:

package.loaded["mymodule"] = nil -- 清除模塊緩存
require("mymodule") -- 重新加載

使用環境隔離

模塊可以通過設置 _ENV 實現沙盒環境,避免污染全局命名空間:

local M = {}
setmetatable(M, { __index = _G }) -- 繼承全局環境
_ENV = M -- 切換環境function add(a, b)return a + b
endreturn M

模塊的依賴管理

模塊可以依賴其他模塊,通過 require 引入:

local json = require("dkjson") -- 引入第三方 JSON 模塊
local M = {}function M.toJson(t)return json.encode(t)
endreturn M

動態加載模塊

loadfiledofile 可以動態加載模塊,但不推薦替代 require

local chunk = loadfile("mymodule.lua") -- 加載但不執行
local M = chunk() -- 執行并獲取模塊

模塊的命名規范

Lua 模塊通常使用小寫字母和下劃線命名,如 my_module.lua。避免與 Lua 關鍵字沖突。

模塊的版本控制

在模塊中定義版本號,便于管理:

local M = {}
M._VERSION = "1.0.0"
return M

模塊的測試與調試

模塊可以通過獨立的測試腳本驗證功能:

local mymodule = require("mymodule")
assert(mymodule.add(1, 2) == 3)

Lua 5.2 后的模塊變化

Lua 5.2 移除了 module 函數,推薦直接使用 return table 的方式定義模塊。

模塊的打包與分發

將模塊打包為 .rocks 文件或直接發布源碼,便于其他開發者使用。LuaRocks 支持模塊發布:

luarocks pack mymodule

模塊的跨平臺兼容性

確保模塊代碼兼容不同操作系統,避免路徑硬編碼:

local path_sep = package.config:sub(1,1) -- 獲取系統路徑分隔符
local path = "foo" .. path_sep .. "bar.lua"

模塊的元表應用

通過元表為模塊添加默認方法或重載操作符:

local M = {}
setmetatable(M, {__add = function(a, b) return a.value + b.value end
})
M.value = 10
return M

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90215.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90215.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90215.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1. boost::asio之socket的創建和連接

網絡編程基本流程 網絡編程的基本流程對于服務端是這樣的 服務端 1)socket——創建socket對象。 2)bind——綁定本機ipport。 3)listen——監聽來電,若在監聽到來電,則建立起連接。 4)accept——再創建一個…

WPF 控制動畫開關

記錄一種實現方式:第一步:首先定義一個靜態類,提供依賴屬性,進而方便在xaml中實現綁定:public static class AnimationBehavior{// 定義附加屬性public static readonly DependencyProperty IsAnimatingProperty Depen…

元素豎向的百分比設定是相對于父容器的高度嗎?

元素豎向的百分比設定是相對于父容器的高度嗎? 核心問題 在CSS中,當設置元素的豎向屬性(如height、padding-top等)為百分比值時,其計算基準是父容器的高度還是寬度? 權威結論height屬性 百分比值基于父容器…

web3.0怎么入局

Web3.0(第三代互聯網)融合了區塊鏈、去中心化應用(DApps)、NFT、DAO等新興技術,給個人和機構提供了許多全新的賺錢機會。入局 Web3.0 賺錢主要有以下幾種途徑,根據你的技術背景、資金能力和時間投入可以選擇適合自己的方式。 目錄 一、普通用戶賺錢方式(門檻低) 1. …

linux入門 相關linux系統操作命令(二)--文件管理系統 ubuntu22.04

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址:星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 兌換碼要是過期了,可以私信我獲取最新兌換碼!&a…

Python-初學openCV——圖像預處理(二)

目錄 一、圖像仿射變換 1、基本性質 二、cv2.warpAffine() 函數 1、圖像旋轉 2、圖像平移 3、圖像縮放 4、圖像剪切 三、 插值方法 1、最近鄰插值 2、雙線性插值 3、像素區域插值 4、雙三次插值 5、Lanczos插值 一、圖像仿射變換 仿射變換(Affine Tr…

醫療AI輕量化部署方案的深度梳理與優化路徑判研

摘要 醫療AI的快速發展為精準診斷、個性化治療和醫療資源優化提供了新機遇。然而,大規模模型的高計算復雜度和資源需求限制了其在資源受限環境(如邊緣設備、基層醫療機構)的應用。本文系統梳理了醫療AI輕量化部署的核心技術體系,包括模型壓縮、參數高效微調(PEFT)、邊緣-…

SSP通過SDK對接流量的原理與實現

一、核心概念解析 1.1 SSP(供應方平臺) 定義:SSP是程序化廣告生態中媒體方的核心工具,通過自動化技術幫助媒體(如網站、應用、視頻平臺)管理廣告資源、優化填充率并最大化廣告收益。核心功能:…

如何清理電腦c盤內存 詳細操作步驟

電腦使用時間不斷延長,許多用戶可能會遇到一個問題——C盤空間不足,導致系統運行緩慢或無法安裝新程序。如果C盤的存儲空間被大量占用,可能會影響到計算機的性能。本文將介紹幾種有效的方法,幫助你清理C盤內存,釋放空間…

ESP32的ADF詳解:5. Streams的API

一、算法流 (algorithm stream) 1. 初始化與配置API功能描述關鍵參數說明algo_stream_init()初始化算法流(AEC/AGC/NS/VAD)config->algo_mask 選擇算法組合config->sample_rate 設置采樣率(默認16kHz)config->partition_…

JavaScript對象鍵序問題解析

問題的發現: 我有一個接口返回一個json數據瀏覽器network里的Response里是從大到小排。 但Preview就是反過來的 問題的描述: 上面那個讓我發現瀏覽器處理對象或者json是會對其鍵值對做排序!!! 在JavaScript中&am…

pandas庫的數據導入導出,缺失值,重復值處理和數據篩選,matplotlib庫 簡單圖繪制

目錄 一.數據導入導出 1.CSV文件讀取與參數說明 2.Excel與TST文件讀取 3.數據導出操作 二.缺失值處理 1.填充缺失值 2.刪除缺失值【刪除整行數據】 三.重復值處理 四.數據篩選與條件查詢 1.邏輯判斷取數 2.字符匹配 3.邏輯運算: &(和&…

FPGA?如何實現另一個?FPGA?

如果你對 FPGA 有些了解,大概知道它的意思是“可編程邏輯器件”,可以把寫好的邏輯電路(通常是 Verilog/VHDL)通過工具綜合、布局布線、燒寫進去,讓一塊芯片變成“你想要的電路”。但如果我告訴你,現在有個開…

文思助手、新華妙筆 AI材料星的公文寫作深度測評

公文寫作一直都是體制內工作人員的日常核心任務,寫公文的難點不僅來自于對政策表述嚴謹性的高要求,也在于格式規范、內容深度以及效率壓力的多重考驗。隨著AI技術的發展,越來越多的文字輔助工具出現,很大程度的緩解了寫作壓力&…

Flutter開發環境搭建與工具鏈

Flutter開發實戰第1章:Flutter開發環境搭建與工具鏈1.1 Flutter簡介與優勢Flutter是Google推出的開源UI工具包,用于從單一代碼庫構建編譯為原生性能的移動、Web和桌面應用程序。Flutter的核心優勢包括:跨平臺一致性:一套代碼運行在…

io_uring:Linux異步I/O的革命性突破

目錄 1. io_uring是什么? io_uring核心優勢: 2. io_uring核心原理 2.1 雙環形緩沖區設計 2.2 關鍵數據結構 1、完成隊列CQ 2、提交隊列SQ 3、Params 3. io_uring工作流程 3.1 初始化階段 3.2 I/O操作流程 4. C代碼示例(原始系統調…

線段樹學習筆記 - 練習題(2)

文章目錄1. 前言2. P3870 [TJOI2009] 開關3. P2184 貪婪大陸4. P1438 無聊的數列5. P1471 方差1. 前言 線段樹系列文章: 線段樹學習筆記。線段樹學習筆記 - 練習題(1)。 前一篇做了幾道線段樹的題目,這篇文章就繼續看下線段樹的…

Vue狀態管理:Pinia 與 Vuex 的使用方法與對比【文章附有完整案例】

最近在接手vue項目的需求,因為之前一直在做react的需求,日常的vue練習也少了很多,導致現在接手vue項目,很多關于vue的知識點基本上忘得干干凈凈了。但是好在有基礎,重新學也會很快掌握。分享這個過程中的一些復習內容。…

OpenMed 項目深度分析:推動醫療 NLP 領域的開源革命

摘要 醫療人工智能(AI)領域因高質量數據和模型的獲取受限而發展緩慢。OpenMed 項目通過開源超過380個醫療命名實體識別(NER)模型,顯著降低了研究與應用門檻。本文從項目背景、技術優勢、應用場景、實施挑戰及未來展望五個方面,系統分析 OpenMed 的核心價值與潛力,揭示其…

大模型開發

什么是Ai?AI的全拼是(Artificial Intelligence)人工智能,使機器能夠像人類一樣思考、學習和解決問題的技術。在AI的應用情況下我們更多的是學習自然語言處理。在自然語言處理(Natural Language Processing,NLP)中,有一項關鍵技術叫…