1. 程式人生 > >Step By Step(Lua模組與包)

Step By Step(Lua模組與包)

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

1 require "mod"
2 mod.foo()
3 local m2 = require "mod2"
4 local f = mod2.foo
5 f()   

    1. require函式:
    require函式的呼叫形式為require "模組名"。該呼叫會返回一個由模組函式組成的table,並且還會定義一個包含該table的全域性變數。在使用Lua中的標準庫時可以不用顯示的呼叫require,因為Lua已經預先載入了他們。
    require函式在搜素載入模組時,有一套自定義的模式,如:
    ?;?.lua;c:/windows/?;/usr/local/lua/?/?.lua


    在上面的模式中,只有問號(?)和分號(;)是模式字元,分別表示require函式的引數(模組名)和模式間的分隔符。如:呼叫require "sql",將會開啟以下的檔案:
    sql
    sql.lua
    c:/windows/sql
    /usr/local/lua/sql/sql.lua
    Lua將require搜尋的模式字串放在變數package.path中。當Lua啟動後,便以環境變數LUA_PATH的值來初始化這個變數。如果沒有找到該環境變數,則使用一個編譯時定義的預設路徑來初始化。如果require無法找到與模組名相符的Lua檔案,就會找C程式庫。C程式庫的搜尋模式存放在變數package.cpath
中。而這個變數則是通過環境變數LUA_CPATH來初始化的。
    
    2. 編寫模組的基本方法:
    見如下程式碼和關鍵性註釋:

複製程式碼
 1 --將模組名設定為require的引數,這樣今後重新命名模組時,只需重新命名檔名即可。 2 local modname = ...
 3 local M = {}
 4 _G[modname] = M
 5 
 6 M.i = {r = 0, i = 1}  --定義一個模組內的常量。 7 function M.new(r,i) return {r = r, i = i} end
 8 function M.add(c1,c2) 
 9     return
M.new(c1.r + c2.r,c1.i + c2.i) 10 end 11 12 function M.sub(c1,c2) 13 return M.new(c1.r - c2.r,c1.i - c2.i) 14 end 15 --返回和模組對應的table。16 return M
複製程式碼

   
    3. 使用環境:
    仔細閱讀上例中的程式碼,我們可以發現一些細節上問題。比如模組內函式之間的呼叫仍然要保留模組名的限定符,如果是私有變數還需要加local關鍵字,同時不能加模組名限定符。如果需要將私有改為公有,或者反之,都需要一定的修改。那又該如何規避這些問題呢?我們可以通過Lua的函式“全域性環境”來有效的解決這些問題。見如下修改的程式碼和關鍵性註釋:

複製程式碼
 1 --模組設定和初始化。這一點和上例一致。 2 local modname = ...
 3 local M = {}
 4 _G[modname] = M
 5 
 6 --宣告這個模組將會用到的全域性函式,因為在setfenv之後將無法再訪問他們, 7 --因此需要在設定之前先用本地變數獲取。 8 local sqrt = mat.sqrt
 9 local io = io
10 
11 --在這句話之後就不再需要外部訪問了。12 setfenv(1,M)
13 
14 --後面的函式和常量定義都無需模組限定符了。15 i = {r = 0, i = 1}
16 function new(r,i) return {r = r, i = i} end
17 function add(c1,c2) 
18     return new(c1.r + c2.r,c1.i + c2.i)
19 end
20  
21 function sub(c1,c2)
22     return new(c1.r - c2.r,c1.i - c2.i)
23 end
24 --返回和模組對應的table。25 return M
複製程式碼


    4. module函式:
    在Lua 5.1中,我們可以用module(...)函式來代替以下程式碼,如:

複製程式碼
1 local modname = ...
2 local M = {}
3 _G[modname] = M
4 package.loaded[modname] = M
5     --[[6     和普通Lua程式塊一樣宣告外部函式。
7     --]]
8 setfenv(1,M)
複製程式碼

    由於在預設情況下,module不提供外部訪問,必須在呼叫它之前,為需要訪問的外部函式或模組宣告適當的區域性變數。然後Lua提供了一種更為方便的實現方式,即在呼叫module函式時,多傳入一個package.seeall的引數,如:
    module(...,package.seeall)

本文出自:http://www.cnblogs.com/stephen-liu74/archive/2012/03/28/2421283.html

相關推薦

Step By Step(Lua模組)

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

Lua模組

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

Lua 模組

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

Step By Step(Lua元表元方法)

 Lua中提供的元表是用於幫助Lua資料變數完成某些非預定義功能的個性化行為,如兩個table的相加。假設a和b都是table,通過元表可以定義如何計算表示式a+b。當Lua試圖將兩個table相加時,它會先檢查兩者之一是否有元表,然後檢查該元表中是否存在__add欄位,

Step By Step(Lua編譯執行錯誤)

    1. 編譯:     Lua中提供了dofile函式,它是一種內建的操作,用於執行Lua程式碼塊。但實際上dofile只是一個輔助函式,loadfile才是真正的核心函式。相比於dofile,loadfile只是從指定的檔案中載入Lua程式碼塊,然後編譯這段程式碼

Step By Step(Lua目錄)

處理 叠代 類型 引用 持久化 系統 for 聲明 錯誤處理 Step By Step(Lua開篇)http://www.cnblogs.com/stephen-liu74/archive/2012/03/17/2403210.html一、簡介二、主要優勢三、應用場景Ste

VmWare 宿主主機通信 STEP BY STEP (適用於剛開始學習的人)

aid 並且 cap 應該 行程 最大的 mtu win7 bringing 基本原理 在虛擬機中有三種通信方式,例如以下圖所看到的 1. Bridged(橋接模式) 在橋接模式下,VMware虛擬出來的操作系統就像是局域網中的一獨立的主機

Step By Step(Lua調用C函數)

extern lua環境 class 數量 lsp 相同 虛擬 c語言代碼 cti 原文: http://www.cnblogs.com/stephen-liu74/archive/2012/07/23/2469902.html Lua可以調用C函數的能力將極大的提高Lu

Step By Step(Lua呼叫C函式)

Lua可以呼叫C函式的能力將極大的提高Lua的可擴充套件性和可用性。對於有些和作業系統相關的功能,或者是對效率要求較高的模組,我們完全可以通過C函式來實現,之後再通過Lua呼叫指定的C函式。對於那些可被Lua呼叫的C函式而言,其介面必須遵循Lua要求的形式,即typedef

Lua學習筆記--模組

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

lua指令碼學習15 模組

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

Tensorflow基礎知識神經網路構建--step by step 入門TensorFlow(一)

Tensorflow基礎知識與神經網路構建–step by step 入門TensorFlow(一) 標籤: Tensorflow 我們將採用Jupyter notebook互動式程式設計的方式,通過一步步程式碼的講解,學習Tensorflow程式設計。

學習mybatis-3 step by step 篇一

odi png environ factor 數據 不能 val 集成開發環境 start 一、搭建簡單mybatis-3環境(詳細的中文文檔) 集成開發環境:IDEA 項目:maven + mybatis-3 1、創建maven結構項目 含簡單,如下圖: 下一步後,填寫

Angular4 step by step.3

pen 分享 -1 edi sco lar ide mod code 1.Routes 路由模塊 1 import { NgModule } from [email protected]/* *//core‘; 2 import

[轉]RDL(C) Report Design Step by Step 3: Mail Label

設置 ted 運算 lec 標題 report 對數 win 信息管理 本文轉自:http://www.cnblogs.com/waxdoll/archive/2006/09/02/493350.html Crystal Report在報表向導中提供了三種向導類型給用戶

WPF Step By Step 系列 - 開篇

gpu 查看 這一 order 界面設計 基礎知識 http 對比 快速 WPF 系列包含的內容 WPF基礎知識介紹 WPF布局介紹 WPF控件介紹(包含第三方控件) WPF自定義模板 WPF依賴屬性、路由事件 WPF的MVVM編程 WPF開發框架Prism WPF開

Quartz.NET開源作業調度框架系列(一):快速入門step by step-轉

rand 隨機 axis 開發人員 c# returns .net開源 觸發 mis  Quartz.NET是一個被廣泛使用的開源作業調度框架 , 由於是用C#語言創建,可方便的用於winform和asp.net應用程序中。Quartz.NET提供了巨大的靈活性但又兼具

Building your Deep Neural Network: Step by Step

pan auto plot chan arr src computing zeros rect Welcome to your week 4 assignment (part 1 of 2)! You have previously trained a 2-layer N

Step By Step 搭建 MySql MHA 集群

ip add 環境 def text 初始化 下載 git 下載源碼 恢復 關於MHA ?? MHA(Master High Availability)是一款開源的mysql高可用程序,目前在mysql高可用方面是一個相對成熟的解決方案。MHA 搭建的前提是MySQL集群中

Struts2+Spring+Hibernate step by step 06 整合Hibernate

emp 2.3 是否 ssh整合 配置 pla sets 映射類 veh 註:該系列教程。部分內容來自王健老師編寫ssh整合開發教程 Hibernate是一款優秀的ORM(Object Relation Mapping-對