モジュールenv
部分的には完璧ではありませんが、探しているものを達成します。
これはグループ化/名前付きインポートを可能にします。いくつか注意が必要ですが、主なものは環境を手動で管理する必要があります。さらに、カスタムパスセットを記述しない限り、テーブルをエクスポートするモジュールで使用するため、インデックスファイル(デフォルトはinit.lua
)を作成する必要があります。
これは少し例です。まずファイル構造を適切に設定する必要があります。
-- main.lua
-- calculations/
-- calc1.lua
-- calc2.lua
-- calc3.lua
-- init.lua
-- helper/
-- print/
-- init.lua
-- graphprinter.lua
-- matrixprinter.lua
少し退屈しているインデックスファイル、:あなたのメインファイル内
-- calculations/init
return {
calc1 = require 'calculations.calc1',
calc2 = require 'calculations.calc2',
calc3 = require 'calculations.calc3'
}
と
-- helpers/print/init
return {
graphprinter = require 'helper.print.graphprinter',
matrixprinter = require 'helper.print.matrixprinter'
}
。主な警告はすぐに表示されますので、ローカル環境をオーバーライドするには、'env'
が必要な機能を使用する必要があります。引数を渡さないと、現在の環境のクローンが作成されます(require
などを保持します)。
-- main.lua
local _ENV = require 'env'() -- (see notes below)
新しい環境は、単一の引数を取るimport
機能を説明する文字列は、現在の環境にインポートパス又はモジュール名を表します。戻り値は、環境状態をさらに変更するために使用できる一時テーブルです。過渡テーブル上の機能の
import 'helper/print' :use '*'
import 'calculations' :use '*'
一つは、いずれかの必要なテーブルから引っ張って値を示す表、またはあなたが必要なテーブルからすべての値を示す文字列たい'*'
を取る:use
、あります現在の環境
print(matrixprinter, graphprinter) --> function: 0x{...} function: 0x{...} (or so)
に配置され、最終的な注意点は、あなたが見てきたすべてのパスがcwd
がmain.lua
を保持しているものと同じであることに依存していることです。サブモジュールを静的な場所に置かないかぎり、package.path
/import.paths
を正しく調整しない限り、lua myapp/main.lua
は大声で失敗します。
require
文の2行を避けるために多くの作業があるようです。
免責事項:私は実験のビットとしてenv
を書きました。
import
が現在.
構文(あなたはOSのパス区切り文字を使用する必要がある)、またはテーブル・チェーンへのテーブルの適切な爆発をサポートしていないことに注意してください。私はこれに対処する作品に少しのパッチがあります。
Lua 5.2+は、ローカル環境をオーバーライドするために_ENV
を使用します。 Lua 5.1では、を使用する必要があります。
前述のように、Luaには実際のディレクトリの概念はありません。あなたが望むものを(オーバーヘッドを少なくして)本当に行うには、独自のカスタムモジュールローダーと環境ハンドラを作成し、LuaFileSystemのようなモジュールを使用してディレクトリ内のすべてのファイルを確実に '自動的に'ロードする必要があります。
TL; DR:
- これは難しい課題です。
- これを簡単にするために、言語には何も組み込まれていません。
- カスタムを書く必要があります。
- 常に欠点があります。
Luaにはフォルダ内のすべてのファイルのリストを取得する機能がないため、モジュールのリストを取得することはできません。しかし、 'io.popen" ls ... "'でシェルコマンドを発行し、次にすべてのモジュールが見つかったら 'require()'することで、モジュールのリストを取得するスクリプトを書くことができます。 –
モジュールにグローバル変数を作成しないという再考もあります。だから、あなたがそれらのすべてをロードすることができても、モジュール値を取得する簡単な方法はありません。だから、すべての必要な値をロードし、ロードされた値をテーブルとして返す個別のファイルを作るだけかもしれません。 – moteus