2012-02-15 12 views
3

私の最初の.luaファイルの変数を上書きしようとしています。ファイルを含めて変数を上書きする

file1.lua

val = 1 
require "file2" 

file2.lua

val = 2 

valはまだこの後の1であるとして、残念ながら、これは、動作するようには思えません。私はそれらのファイルの潜在的な将来のユーザーがファイルを含めることができるように、思い付いた解決策は、私はLuaのを初期化するとき、今挿入するためだ新しい関数、次のとおりです。

function include(file) 
    dofile("path/since_dofile_doesnt_seem_to_use/package/path" .. file .. ".lua") 
end 

これは期待どおりに動作しますが、私はまだLuaを初めて使っているので、もっと良い解決策があるかどうかを知りたいと思います。多分何かがすでに組み込まれていますか?

更新:

私の問題は、私が誤って複数のファイルを介して、FILE2を複数回必要としたことで、Luaが値を変更するには、もう一度それをロードしません。解決済み。

+0

'val'がグローバルであれば、最初に試してみるべきです。 –

+0

さて、「ローカル」はなく、グローバルでなければなりません。それも私を混乱させるものです。私はちょうど純粋なルアでこれをテストしました、そして、それは働いています...?私はluaL_dofileでfile1を実行しています。そこには機能しません。これは奇妙です。 – Mars

+0

ええと、C(++)コードを投稿する必要があります –

答えて

4

Luaはあなたが呼ばれるテーブルで、あなたのコード内でrequire Dを持っているすべてのファイルを追跡しなければなりませんpackage.loaded。ファイルがrequire dになるたびに、そのテーブルがチェックされ、モジュール名がすでにテーブルに存在する場合はロードされません。テーブルに存在しない場合は、モジュールがロードされ、テーブルに名前が追加されます。この方法では、モジュールrequireを何回も実行できますが、初めて実行されるだけです。

requireパッケージの後にpackage.loaded[packagename] = nilと設定することで回避できます。そうすれば、luaがパッケージ名がテーブルに存在するかどうかを調べると、パッケージ名が見つからないため、必要な回数だけパッケージ名を要求することができます。

0

file2.luaに

print(val) 
_G.val = 2 
print(val) 

出力は

+0

もしあなたが達成しようとしていることをもう少し正確に記述することができたら、ちょっと正しい方向を指すことができるかもしれません... _Gはローカルまたはインポートで作成されたグローバル変数にアクセス/スコープ_G.var = value –

+0

私は上記の投稿にコメントすることはできませんが、必要な質問に答えることができます...ルアは、必要な再帰に対する警備を内蔵しています。ファイルAがファイルBを必要とし、ファイルBがファイルAを必要とする場合、ファイルAがロードされると、ファイルBがAを必要とするポイントまでファイルBをロードします。そのコードはrequire( "fileA")の前になければなりません。 –

関連する問題