Luaのモジュールパッケージ
モジュールはLuaの5.1から始まって、ライブラリパッケージに似て、Luaはあなたがコードの再利用を支持して、他の場所でのAPIインタフェース呼び出しの形で、一つのファイルにいくつかの共通のコードを入れて、減らすことができ、標準モジュール管理機構を追加しましたコードのカップリング。
Luaのモジュールは、このように非常に簡単なモジュールを作成し、変数、関数、および他の既知の要素からのテーブルであり、その後、定数をエクスポートする必要がテーブルを作成することで、機能その中に、最終的にライン上のテーブルに戻りました。 以下は、ファイルのコード形式をカスタムモジュールmodule.luaを作成している次のとおりです。
-- 文件名为 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
以上のことから、モジュールの構造は、テーブル構造であるので、あなたは、呼び出し元のモジュールまたは関数に定数として動作するように操作の要素としてテーブルを呼び出すことができます。
したがって、プライベート関数を意味し、ローカル変数はブロックとして宣言上記の関数func2は、モジュールのパブリック関数によって呼び出されなければなりませんプライベート機能モジュールの外部からアクセスすることはできません。
機能を必要とします
Luaは、モジュールをロードするために使用されている必要と呼ばれる機能を提供します。 モジュールをロードするには、単にそれを呼び出します。 例えば:
require("<模块名>")
または
require "<模块名>"
実行後に戻りますと、テーブルから成るモジュールによって定数や関数を必要とし、テーブルを含むグローバル変数を定義します。
-- test_module.lua 文件 -- module 模块为上文提到到 module.lua require("module") print(module.constant) module.func3()
上記のコードは、の結果として実行されます。
这是一个常量 这是一个私有函数!
またはモジュールは、エイリアス変数を定義ロードし、簡単に呼び出し:
-- test_module2.lua 文件 -- module 模块为上文提到到 module.lua -- 别名变量 m local m = require("module") print(m.constant) m.func3()
上記のコードは、の結果として実行されます。
这是一个常量 这是一个私有函数!
ローディング機構
カスタムモジュールの場合は、ファイルではなくディレクトリ致します、その上に、機能は独自のファイル・パス・ロード戦略を持っている必要が、それは、Luaのか、Cプログラムライブラリからモジュールファイルをロードしようとします。
Luaのファイルの検索パスは、Luaのブーツの後、環境変数のLUA_PATH初期値環境変数に、グローバル変数package.pathに格納されている必要があります。 あなたは環境変数が見つからない場合は、デフォルトのパスは、コンパイル時の初期設定で定義されました。
何LUA_PATHこの環境変数が存在しない場合はもちろん、あなたもLUA_PATH環境に参加する(それが作成されません、あなたはまた、.bashrcファイルを開くことができます).profileファイル現在のユーザーのホームディレクトリにオープン、例えば、「〜/ LUA / "パスを設定をカスタマイズすることができます変数:
#LUA_PATH export LUA_PATH="~/lua/?.lua;;"
ファイルパス ";"最後の二つの ";;"で区切られたが、新たに追加されたプラスのデフォルトパスの元のパスを表します。
次に、すぐに効果を取るために、ご使用の環境変数パラメータを更新。
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
呼び出すときにターゲットを検索するには、次のファイルディレクトリを開こうとします(「モジュール」)が必要です。
/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です。
検索上記と同じと戦略が、今検索がそのように置換されているかのdllファイルタイプ。 あなたはそれを見つけた場合、それはそれをロードするためにpackage.loadlibによって必要になります。
Cパッケージ
LuaのとCは簡単にLuaのパッケージを書き込むためにCを使用して合成されます。
別のパッケージとのLuaを書く、使用前にCパッケージが最初にロードされ、接続されている必要があり、ほとんどのシステムでダイナミックリンクライブラリ機構を実現するための最も簡単な方法です。
Luaはloadlibを呼び出された関数で動的リンクのすべての機能を提供します。 ライブラリ初期化関数への絶対パス:この関数は、2つの引数を取ります。 だから、一般的なコールの例は次のとおりです。
local path = "/usr/local/lua/lib/libluasocket.so" local f = loadlib(path, "luaopen_socket")
我々はLuaの中で直接彼を呼び出すことができるようにLOADLIB機能は、そうでなければ、彼は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() -- 真正打开库
我々はバイナリライブラリのリリースは、以前のコードスニペット同様のスタブファイルが含まれている期待する通常の状況下では、インストールのバイナリが簡単にディレクトリに配置することができ、あなただけのバイナリライブラリスタブファイルが実際のパスに対応して変更する必要があります。
ファイルがスタブLUA_PATHに追加されたディレクトリには、この設定は、Cライブラリ関数が必要とロードした後に使用することができます。