lua require與module
一、模組機制module
1.什麼是module
對於使用者來說,一個module相當於一個so庫。模組的主要目標是實現程式碼的共享。
2.如何編寫module
lua是通過table來實現模組的,典型的寫法如下。
local M = {} ---- 通常是加local的,如果不加,則M預設註冊到_G中,require後,即使不return也可以直接使用M。加了local是區域性變數,需要顯示的return一下。
M.print = function(...)
print(...)
end
return M
二、require機制
1.require實現原理:
function require(name)
if not packge.loaded[name] then ---- 避免重複載入
local loader = findloader(name) ---- 如果是so,就以loadlib方式載入檔案,如果是lua檔案,就以loadfile方式載入檔案。
if loader == nil then
error("unable to load module " .. name)
end
package.loaded[name] = true ---- 將模組標記為以載入,我們有時候會看到require返回true的現象,是由於被呼叫的模組,沒有顯示的執行package.loaded[modname] = M或者給出return M這樣的返回值。
local res = loader(name) ---- require會以name作為入參來執行該檔案,如果有返回結果,就將返回結果儲存在package.loaded[name]中,如果沒有返回結果,就直接返回package.loaded[name]。如果我們在被呼叫的檔案中直接寫明return 1。則呼叫者的require的返回結果就是1。但是隻要我們顯示的在require檔案中寫明瞭_G[modname] = M,我們仍然可以在require之後,直接使用M作為名字來呼叫,是由於將M加入到了_G中。
if res ~= nil then
package.loaded[name] = res
end
end
return package.loaded[name]
end
2.require實現解析:
傳參: require會將模組名作為引數傳遞給模組
返回值:如果一個模組沒有返回值的話,require就會返回package.loaded[modulename]作為返回值。
------------------------example---------------------
舉例:
pa.lua:
local modname = ...
local M = {}
_G[modname] = M
package.loaded[modname] = M
function M.print_mob()
print(modname)
end
mob.lua:
require "pa"
pa.print_mob()
執行結果:
lua mob.lua
pa
------------------------------------------------------------
分析:
pa.lua中的modname接收的是require傳遞過來的引數,將其加入到全域性環境變數_G中,相當於動態建立了一個modname的表(注意:表名的賦值實際上是引用,相當於C語言中的指標,即使是傳參也會有相同的效果)。我們經常local m = require "mdname",實際上是將生成的表進行了重新命名,但是本質上還是mdname這個表。
pa.lua中的return M我們沒有顯示宣告,由package.loaded[modulename]來代替,通過require實現機制可以看到,這時候返回值應該是true。
三、環境
lua用_G一張表儲存了全域性資料(變數,函式和表等)。
如上分析,我們定義一個module,如果不加local,則它是一個註冊在全域性下的表。我們通過加local避免了它在汙染全域性表空間,只在本檔案生效。如果我們沒有將其註冊到_G下,在其他檔案是無法直接通過他的原始名字來訪問的。不便利的地方,每個函式前面都要帶M,M的下的函式相互訪問也要帶M頭。
解決方法:通過setfenv
local modname = ...
local M = {}
_G[modname] = M
package.loaded[modname] = M
setfenv(1, M)
後續的函式直接定義名字,因為他們的環境空間已經由_G改為了M。
如果要使用全域性函式,則可以本地額外增加一條local _G = _G或者setmetatable(M, {__index = G})。
更好的方法是在setfenv之前將需要的函式都儲存起來,local sqrt = math.sqrt
四、module函式
local M = {}
_G[modname] = M
package.loaded[modname] = M
<set for external access: eg setmetatable(M, {__index = _G})>
setfenv(1, M)
等同於module(modname)。
預設情況下,module不提供外部訪問,如果要訪問外部變數,兩種方法:
1.在宣告module之前,local 變數 = 外部變數
2.使用module(modname, package.seeall), 等價於setmetatable(M, __index = _G)
相關推薦
lua require與module
一、模組機制module 1.什麼是module 對於使用者來說,一個module相當於一個so庫。模組的主要目標是實現程式碼的共享。 2.如何編寫module lua是通過table來實現模組的,典型的寫法如下。 local M = {}
js學習記錄之(一)require 與module.exports
1. js 裡面的程式碼可以放在不同的檔案裡,稱為程式碼模組2.當一個模組需要引用其他模組中程式碼的時候,就用require匯入相應的模組(使用程式碼塊),用module.exports指向一個程式碼塊(製作程式碼塊)3. 檔案1.js var codeUtils =
lua加密與require問題
lua的加密方式有不少,其中以luac和string.dump為例,首先到官網下載lua原始碼包,http://www.lua.org/ftp/,建議不要選最新的幾個,他有個etc資料夾是沒有了的,看了一下沒看到整合到哪裡去了,暫時不管因為和目的無關。 下載好了之後開啟一個
Lua中的模組與module函式
這篇文章主要介紹了Lua中的模組(module)和包(package)詳解,本文講解了require函式、寫一個模組、package.loaded、module函式等內容. 從Lua5.1版本開始,就對模組和包添加了新的支援,可是使用require和module來定義和
lua require
demo oca req 繼續 class log 不存在 dem cal ?;?.lua;/usr/ect/?;/usr/local/lua/?/?.lua require ‘demo" demo demo.lua /usr/etc/demo /usr/local/
nodejs中exports與module.exports的區別
ons src uri 技術分享 20px boolean 微軟雅黑 是否 不一定 [原文] 你肯定非常熟悉nodejs模塊中的exports對象,你可以用它創建你的模塊。例如:(假設這是rocker.js文件)exports.name = function() {
Lua--------------------unity3D與Slua融合使用
tar 對象 調用 pin dal etl 可能 turn defined 下載與安裝 下載地址 GitHub 安裝過程 1.下載最新版,這裏, 解壓縮,將Assets目錄裏的所有內容復制到你的工程中,對於最終產品,可以刪除slua_src,例子,文檔等內容,如果是開
Node.js中exports與module.exports的區別
個數 error: years 信息 輸出 一個數 mil 導出 原來 一、exports使用 test.js exports.name = function() { console.log(‘張三‘); }; index.js使用 var test= req
exports與module.exports的區別
構造方法 什麽 erro 學習 自己的 我只 屬性和方法 現在 內置 nodejs有自己的模塊系統,分為文件模塊和內置模塊。webpack是運行在node環境中,在學習vue-cli的webpack配置的時候, 發現有的文件模塊: exports.fun1=function
Lua 中與字符串有關的函數學習
ons str orm 一次 uno 指定 整型數字 code style 1 string1 = "lua" 2 print(string.upper(string1)) 3 4 string2 = ‘LGS‘ 5 print(string.lower(st
node.js中exports與module.exports的區別分析
前言 關於Node.js中的exports和module.exports,很多時候都比較容易讓人混淆,弄不清楚兩者間的區別。那麼我們就從頭開始理清這兩者之間的關係。 來源 在開發Node.js應用的時候,很多模組都是需要引入才能使用,但是為什麼exports和module.exports我們沒有引用卻可
Redis Lua程式設計與除錯工具使用
前言 Redis自2.6.0版本開始內建Lua直譯器。 Lua,輕量級指令碼語言,號稱最快的指令碼語言。 兩者結合將爆發出巨大的威力。 簡介 Redis Lua指令碼可以呼叫原生的Redis命令,也可以包含自定義的控制流、邏輯運算、數學運算等,將複雜的業務邏輯封
nodejs(四)require與exports
上一篇文章講了require引入模組,其實require有兩個功能: 1.載入檔案模組,並執行裡面程式碼 2.拿到被載入檔案模組匯出的介面物件,就是exports匯出的內容 首先每個模
lua設計與實現(二)資料型別
lua中的資料型別 //lua.h /* ** basic types */ #define LUA_TNONE (-1) #define LUA_TNIL 0 #define LUA_TBOOLEAN 1 #define LUA_TLIGHTUSERD
exports與module.exports的區別,export與export.defult區別
使用 es6 webpack 前端工程 關系 import 接口 的區別 通過 在JS模塊化編程中,之前使用的是require.js或者sea.js。隨著前端工程化工具webpack的推出,使得前端js可以使用CommonJS模塊標準或者使用ES6 moduel特性。 在C
nodejs基礎教程--require 、module和exports
一 require 1 a是內建模組(優先順序0) require('a') //返回該模組 2(以 “./” 或者 “/” 或者 “../” 開頭 )(優先順序1) require('./a.js') //或 require('./a') no
簡單說明 exports 與module.export的區別
exports:首先對於本身來講是一個變數(物件),它不是module的引用,它是{}的引用,它指向module.exports的{}模組module.exports:首先,module是一個變數,指向一塊記憶體,exports是module中的一個屬性,儲存在記憶體中,然後
Node中exports與module.export的使用與區別
module.exports與exports的介紹module.exports與exports都是將函式或者是方法暴露出去,require的時候進行呼叫,但是2者是有區別的。以下是程式碼://ex.js exports='danhuangmode'; //mex.js module.exports='
require與import的區別
第一、兩者的載入方式不同,require是在執行時載入,而import是在編譯時載入 require('./a')(); // a模組是一個函式,立即執行a模組函式
nodejs中exports與module.exports的區別詳細介紹
(轉自網際網路 版權歸原作者) 你肯定非常熟悉nodejs模組中的exports物件,你可以用它建立你的模組。例如:(假設這是rocker.js檔案) 程式碼如下: exports.name = function() { console.log('My name