2016-11-10 8 views
1

Javaからのアスタリスク記号(import java.awt.*)と同様に、一度に複数のLuaモジュールを必要としたい。この私が、サブディレクトリに私のモジュールを組織構造:1つのステートメントで複数のモジュールを要求する方法は?

<myapp> 
-- calculations 
    -- calc1 
    -- calc2 
    -- calc3 
-- helper 
    -- help1 
    -- help2 
    -- print 
      --graphprinter 
      --matrixprinter 

私のクライアントは、サブパスの各モジュールが必要です。

local graphprinter = require("myapp.helper.print.graphprinter") 
local matrixprinter = require("myapp.helper.print.matrixprinter") 

Iからローカルテーブル名を導出する、自動マルチ必要が好むだろう一度にサブパス全体を必要とします。これは、フォーマット:require("myapp.helper.print.*")とすることができます。自動的にローカルテーブル名はサブディレクトリのモジュールごとに作成する必要があります。そのため、モジュールごとにモジュールを必要とするので、違いはありません。

+1

Luaにはフォルダ内のすべてのファイルのリストを取得する機能がないため、モジュールのリストを取得することはできません。しかし、 'io.popen" ls ... "'でシェルコマンドを発行し、次にすべてのモジュールが見つかったら 'require()'することで、モジュールのリストを取得するスクリプトを書くことができます。 –

+1

モジュールにグローバル変数を作成しないという再考もあります。だから、あなたがそれらのすべてをロードすることができても、モジュール値を取得する簡単な方法はありません。だから、すべての必要な値をロードし、ロードされた値をテーブルとして返す個別のファイルを作るだけかもしれません。 – moteus

答えて

1

モジュール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) 

に配置され、最終的な注意点は、あなたが見てきたすべてのパスがcwdmain.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:

  • これは難しい課題です。
  • これを簡単にするために、言語には何も組み込まれていません。
  • カスタムを書く必要があります。
  • 常に欠点があります。
4

他のすべてのライブラリを必要とするフォルダごとにinit.luaファイルを書き留めてみませんか?

は例えば、計算であなたは次にあなただけのcalculations = require "calculations"を書くことができます

return { 
    calc1 = require "calc1"; 
    calc2 = require "calc2"; 
    calc3 = require "calc3"; 
} 

を含むファイルを作成し、それが自動的にcalculations.calc<1-3>

これは、全体のディレクトリ構造のために行うことができ、かつrequire "helper"をロードしますrequire "help1"に電話をかけ、require "print"を呼び出して、最後に機能を見つけることができます。helper.help1.print.<function>

この動作の簡単な説明:require "library" luaを実行すると、library.luaというファイルまたはディレクトリにあるinit.luaというファイルを含めるようにします。これはrequire "dir/lib"の代わりにrequire "dir.lib"を実行する理由でもあります。あなたがちょうどrequire "dir"のときにフィールドlibを含むテーブルを返すので、それは​​としてアクセスするでしょう。

関連する問題