2

異なるフォルダーに複数のモジュールを持つプログラムを作成したいと考えています。メイン プログラムは、どのモジュールをロードする必要があるかを判断し、それをロードします。それに加えて、いくつかのコア機能もロードされます。

このロジックのプロトタイプを作成しましたが、うまく機能します。しかし、私はLuaが初めてなので、これを実装するために何が正しいのかわかりません。

今のところ、次のファイル構造があります。

ここに画像の説明を入力

aoc (メインプログラム):

aoc = {}
aoc_base_path = debug.getinfo(1).source:match("@(.*)/.*$") -- base path to my program
if not aoc_base_path then
  aoc_base_path = ''
else
  aoc_base_path = aoc_base_path..'/'
end

local aoc_base_arg={...}
dofile(aoc_base_path.."core/core")

local module = assert(loadfile(aoc_base_path.."modules/"..aoc_base_arg[1].."/module"))
local arg = table.copy(aoc_base_arg) -- this is my custom function (I'm not provide you with listing, it just copy one table to another one
table.remove(arg,1)
module(arg,aoc) -- pass to module all arguments except first one

core/core (コア関数ローダー):

dofile (aoc_base_path..'core/move')

コア/ムーブ:

local function move(direction, refuel, dig, attack)
  -- some logic in local function (to not be overwriten in module)
end

function aoc.move()
  -- global function (it logic can be changed by module in case it needed)
  return move()
end

モジュール/鉱山/モジュール(モジュール):

local arg={...} -- I passed 2 arguments in aoc main program
arg = arg[1]
local aoc = arg[2]
aoc.move()

今のところ

lua> aoc mine

また

lua> path/to/aoc mine

正常に動作します。しかし、私が何か間違ったことをしている場合、誰かが私を指摘できますか?

編集:取得でロジックを変更aoc_base_path

4

3 に答える 3

1

aocを少し単純化できます。

aoc = {}
aoc_base_path = debug.getinfo(1).source:match("@(.*/)") or ''

dofile(aoc_base_path.."core/core")

local module = assert(loadfile(aoc_base_path.."modules/".. ... .."/module"))
module({select(2,...)},aoc) 
于 2013-04-12T09:32:51.100 に答える
0

Lua のライブラリ組み込みモジュール機能をrequire. を適切にセットアップpackage.loadersすれば、この標準システムを構成して、好きな場所から好きな方法でモジュールをロードできます。HTTP から直接、RFC 1149 に従って pigeons によって配信される特定のディレクトリ - それはすべてを行うことができます。

于 2013-04-12T12:18:07.070 に答える