## 定義模塊:文件名為 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("<模塊名>")
或者
require "<模塊名>"
新建文件并使用:
```
require("module")
print(module.constant)
module.func3()
//可以給加載的模塊定義別名
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 庫了。
- 基礎
- 循環
- 迭代器
- ipairs與pairs 的區別
- 流程控制if
- 函數
- 運算符
- 字符串
- 數組
- table(表)
- 模塊與包
- 魔獸插件
- 初學介紹
- api
- Global API
- Widget API
- 窗口小部件類層次結構(Widget Class Hierarchy)
- 動畫(Animation)
- 透明度(Alpha)
- 線條縮放比例(LineScale)
- 平移(Translation)
- 線平移(Line Translation)
- 路徑(Path)
- 旋轉(Rotation)
- 縮放(Scale)
- 紋理坐標平移(TextureCoordTranslation)
- 框架 :Frame
- 瀏覽器(Browser)
- 按鍵(Button)
- Item按鈕(ItemButton)
- 檢查按鈕(CheckButton)
- 檢測(Checkout)
- 顏色選擇(ColorSelect)
- 冷卻(Cooldown)
- 編輯框(EditBox)
- 戰爭迷霧(FogOfWarFrame)
- 游戲工具提示(GameTooltip)
- 消息框(MessageFrame)
- 小地圖(Minimap)
- 模型(Model)
- 玩家模型(PlayerModel)
- 電影模型(CinematicModel)
- 換裝模型(DressUpModel)
- 戰袍模型(TabardModel)
- _模型場景(ModelScene)
- 電影Frame(MovieFrame)
- 根小部件(Root Widgets)
- UIObject衍生品(UIObject Derivatives)
- 動畫衍生品(Animation Derivatives)
- FontInstance
- 地區衍生品(Region Derivatives)
- 幀衍生品(Frame Derivatives)
- 特殊(Special)
- Events(游戲中變化的事件)
- WoWAPI
- Global Function Groups
- 帳戶(Account)
- 成就(Achievements)
- 動作條(Action Bars)
- Action Buttons
- 插件(AddOns)
- 冒險指南(Adventure Guide)
- 神器(Artifact)
- 拍賣行(Auction House)
- 黑市AH
- 魔獸代幣(WoW Tokens)
- Azerite
- 背包(Bags)
- 容器(Containers)
- 庫存(Inventory)
- 銀行(Bank)
- 公會銀行(Guild Bank)
- 理發店(Barber Shop)
- 書籍(書籍)
- 日歷(calendar)
- 相機(Camera)
- 頻道(Channels)
- 聊天窗口(Chat Window)
- 社區(communities)
- 語音聊天(Voice Chat)
- 推特(Twitter)
- 角色(Character)
- 角色表(Paper Doll)
- 試衣間(dressing room)
- 活動(Movement)
- 指定目標(Targeting)
- 死亡(Death)
- 過場動畫(Cinematics)
- 職業(class)
- 天賦(Talents)
- 收藏(Collections)
- 坐騎(Mount Journal)
- 寵物(Pet Journal)
- 玩具箱(Toy Box)
- 傳家寶(Heirlooms)
- 外觀(Appearances)
- 戰斗記錄(Combat Log)
- 戰斗寵物(Combat Pets)
- 同伴(Companions)
- Contribution Collection
- 貨幣(Currency)
- 光標(Cursor)
- 客戶支持(Customer Support)
- 知識庫(Knowledge Base)
- 設備管理器(Equipment Manager)
- 擴展(Expansions)
- FrameXML
- 好友(Friends)
- Who List
- 真實身份證(Real ID)
- 招募朋友(Recruit-a-Friend)
- 駐軍(Garrisons)
- 建筑物(Buildings)
- 戰利品(Trophies)
- 追隨者與任務(Followers & Missions)
- 團隊(Groups)
- Raid Groups
- Raid Profiles
- 組查找器(Group Finder)
- 突襲者(Raid Finder)
- 公會(Guild)
- 檢查(Inspection)
- Instances
- 場景(Scenarios)
- Mythic+
- 入侵(Invasions)
- 海島探險(Island Expeditions)
- Items
- 按鍵綁定(Key Bindings)
- Modifiers
- 劫掠(Looting)
- 失控(Loss of Control)
- 宏命令(Macros)
- 郵件(Mail)
- 地圖(Maps)
- 飛行管理員(Flight Master)
- 追蹤(Tracking)
- 商人(Merchant)
- 銘牌(Nameplates)
- 寵物大戰(Pet Battles)
- 申請書(Petitions)
- 專業(Professions)
- 考古(Archaeology)
- 附魔(Enchantments)
- 雕文(glyphs)
- 物品插口(tem Socketing)
- PvP
- 競技場(Arena)
- 戰場(Battlegrounds)
- 世界戰場(World Battlefields)
- 爭吵(Brawl)
- 戰爭游戲(War Games)
- 戰爭模式(War Mode)
- 任務 (Quests)
- 任務日志(Quest Log)
- 任務選擇(Quest Choices)
- Task Quests
- 閑聊(Gossip)
- 探險地圖(Adventure Map)
- 戰爭戰役(War Campaigns)
- 種族(Races)
- 境界(Realms)
- 報告(Reporting)
- 聲望(Reputation)
- 報廢的機器(Scrapping Machine)
- 法術(Spells)
- Spell Book
- 商店(Shop)
- 召喚(Summoning)
- 系統(System)
- 網絡(Network)
- 控制臺(Console)
- 日期時間(Date & Time)
- 調試(Debugging)
- 圖形(Graphics)
- 語言環境(Locales)
- 腳本分析(Script Profiling)
- 安全執行(Secure Execution)
- 聲音(Sound)
- Sound Drivers
- Talking Head
- 交易(Trading)
- 訓練師(Trainer)
- 遷移(Transmogrification)
- 空白存儲(Void Storage)
- 講解(Tutorials)
- UI對象(UI Objects)
- 框架(Frame)
- 字體(Font)
- 質地(Texture)
- 混合(Mixin)
- 咒語(SpellMixin)
- ItemMixin
- 物品位置(ItemLocationMixin)
- PlayerLocationMixin
- 模型場景(ModelScene)
- 未分類
- UI窗口小部件管理器(UI Widget Manager)
- 單位(Units)
- 光環(Auras)
- 玩家(Players)
- 實用程序(Util)
- 車輛(Vehicles)
- Classic Specific Functions
- 獵人寵物(Hunter Pets)
- 專業(Professions)
- 手工制作(Crafting)
- @PvP
- 模擬器
- 訓練師(Trainer)
- 8.x API
- 控制臺(Console)
- 召喚(Summoning)
- See also
- 外部鏈接(External links)
- Widget handlers(UI交互事件)
- ScriptObject
- AnimationGroup
- Animation對象
- Alpha對象
- Scale
- LineScale
- Translation
- LineTranslation
- Path
- Rotation
- TextureCoordTranslation
- Frame
- Browser
- Button
- CheckButton
- ItemButton
- Checkout
- ColorSelect
- Cooldown
- EditBox
- FogOfWarFrame
- GameTooltip
- Model
- PlayerModel
- CinematicModel
- DressupModel
- TabardModel
- MovieFrame
- ScrollFrame
- Slider
- MessageFrame
- Minimap
- ModelScene
- OffScreenFrame
- POIFrame
- ArchaeologyDigSiteFrame
- QuestPOIFrame
- ScenarioPOIFrame
- SimpleHTML
- StatusBar
- UnitPositionFrame
- WorldFrame
- 入門
- .toc
- .lua
- .xml
- 示例
- 自動邀請插件
- 完整例子:顯示任務坐標
- eCoordinates.toc
- eCoordinates.xml
- eCoordinates.lua
- 開發幫助組件
- AddOn Studio編輯器
- 暴雪自帶調試工具
- DevTools調試插件
- wowlua
- 魔獸宏
- 戰斗寵物命令
- 暴雪界面命令
- 聊天命令
- chat substitutions
- 角色指令
- 開發者工具
- 表情動作
- 戰斗命令
- 公會命令
- 小隊與團隊命令、
- 寵物命令
- PvP的命令
- 系統命令
- 目標函數
- 命令
- 被禁用的命令
- 宏條件
- 裝備物品編號