2009-09-02 20 views
3

luaファイルを一度しか実行しない方法があるのだろうか。Luaで一度だけファイルを実行する

私はすでにC++ヘッダーの#if/else/endifトリックに似たことを考えました。私はこれを実装する標準的な方法があるのだろうかと思います。

ジェームズ

+0

"luaファイルをどうやって"ってどういう意味ですか? –

+0

私は現在、1つのファイルの複数の場所からdofile()を使用しています。 – jameszhao00

+0

私はいつも 'dofile'の前に' require'を優先したいと思います。ただし、各呼び出しでファイル全体を明示的に*実行したい場合を除きます。* – nonchip

答えて

11

だけでなく、requireはかなりのことを行います。

require "file" -- runs "file.lua" 
require "file" -- does not run the "file" again 
+0

ありがとうございます。何らかの理由でluaファイルのモジュール定義も必要と思っていました。 – jameszhao00

+2

'require'によって実行されたファイルがモジュールテーブルを作成したり何かを返さなかった場合、' require'は 'package.loaded'に' true'を格納します。それ以外の場合は、ファイルを実行して返された値を格納します。 'module'関数はこの井戸と相互作用します。これはPiLですべて説明されていますが、オンラインコピーはこれらの詳細については印刷版ほど良くありません。 – RBerteig

2

requireの唯一の問題は、ファイル名ではなくモジュール名で動作することです。特に、requireはパスを持つ名前を処理しません(ただし、ファイルシステム内のモジュールを見つけるためにpackage.pathとpackage.cpathを使用します)。

あなたはパスと名を処理したい場合は、次のようにdofileする単純なラッパーを書くことができます:LHFの回答に基づいて

do 
    local cache={} 
    local olddofile=dofile 
    function dofile(x) 
    if cache[x]==nil then 
     olddofile(x) 
     cache[x]=true 
    end 
    end 
end 
+0

上記のTHC4kのソリューションもファイルに対して動作します。ファイルがabc.luaと呼ばれる場合、require( 'abc')が機能します。 – jameszhao00

+1

はい、ただし、dofile "/home/lhf/scripts/abc.lua"を実行している場合は表示されません。 – lhf

+0

実際にあなたは 'require" /path/to/file.lua "' – nonchip

0

が、packageを利用し、あなたも一度これを行うことができます:

package.preload["something"]=dofile "/path/to/your/file.lua" 
をその後、

と使用:

local x=require "something" 

再びプリロードされたパッケージを取得します。それはちょっと乱暴です...

関連する問題