Step By Step(Luaモジュールとパッケージ)

3004 ワード

Lua 5.1から、requireとmodule関数を使用してLua内のモジュールを取得および作成できます.使用者の観点から、1つのモジュールは1つのライブラリであり、requireでロードすることができ、その後tableタイプのグローバル変数が得られる.このときtableは名前空間のように、次のような関数と定数にアクセスできます.

require "mod"
mod.foo()
local m2 = require "mod2"
local f = mod2.foo
f()

1.require関数:
require関数の呼び出し形式はrequire「モジュール名」です.呼び出しは、モジュール関数からなるtableを返し、tableを含むグローバル変数も定義します.Luaの標準ライブラリを使用する場合は、Luaが事前にロードされているため、表示されない呼び出しrequireを呼び出すことができます.
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.モジュール作成の基本方法:
次のコードとキーノートを参照してください.


-- require , , 。
local modname = ...
local M = {}
_G[modname] = M

M.i = {r = 0, i = 1} -- 。
function M.new(r,i) return {r = r, i = i} end
function M.add(c1,c2)
return M.new(c1.r + c2.r,c1.i + c2.i)
end

function M.sub(c1,c2)
return M.new(c1.r - c2.r,c1.i - c2.i)
end
-- table。
return M

3.使用環境:
上記の例のコードをよく読むと、詳細な問題を見つけることができます.たとえば、モジュール内の関数間の呼び出しは、モジュール名の修飾子を保持し、プライベート変数であればlocalキーワードを追加する必要があり、モジュール名修飾子を追加することはできません.私有を公有に変更する必要がある場合、または逆に、一定の修正が必要です.では、これらの問題をどのように回避すればいいのでしょうか.Luaの関数「グローバル環境」によってこれらの問題を効果的に解決することができる.次のように修正されたコードとキーコメントを参照してください.


-- 。 。
local modname = ...
local M = {}
_G[modname] = M

-- , setfenv ,
-- 。
local sqrt = mat.sqrt
local io = io

-- 。
setfenv(1,M)

-- 。
i = {r = 0, i = 1}
function new(r,i) return {r = r, i = i} end
function add(c1,c2)
return new(c1.r + c2.r,c1.i + c2.i)
end

function sub(c1,c2)
return new(c1.r - c2.r,c1.i - c2.i)
end
-- table。
return M

4.module関数:
Lua 5.1ではmodule(...)を使うことができます次のようなコードの代わりに、関数を使用します.


local modname = ...
local M = {}
_G[modname] = M
package.loaded[modname] = M
--[[
Lua 。
--]]
setfenv(1,M)

デフォルトではmoduleは外部アクセスを提供しないため、呼び出す前に、アクセスが必要な外部関数またはモジュールに適切なローカル変数を宣言する必要があります.そしてLuaは、module関数を呼び出すときに、1つのpackageが複数入力というより便利な実装を提供する.seeallのパラメータ:
module(...,package.seeall)
原文:http://www.cnblogs.com/stephen-liu74/archive/2012/07/04/2421283.html