luaファイルを一度しか実行しない方法があるのだろうか。Luaで一度だけファイルを実行する
私はすでにC++ヘッダーの#if/else/endifトリックに似たことを考えました。私はこれを実装する標準的な方法があるのだろうかと思います。
ジェームズ
luaファイルを一度しか実行しない方法があるのだろうか。Luaで一度だけファイルを実行する
私はすでにC++ヘッダーの#if/else/endifトリックに似たことを考えました。私はこれを実装する標準的な方法があるのだろうかと思います。
ジェームズ
だけでなく、require
はかなりのことを行います。
require "file" -- runs "file.lua"
require "file" -- does not run the "file" again
ありがとうございます。何らかの理由でluaファイルのモジュール定義も必要と思っていました。 – jameszhao00
'require'によって実行されたファイルがモジュールテーブルを作成したり何かを返さなかった場合、' require'は 'package.loaded'に' true'を格納します。それ以外の場合は、ファイルを実行して返された値を格納します。 'module'関数はこの井戸と相互作用します。これはPiLですべて説明されていますが、オンラインコピーはこれらの詳細については印刷版ほど良くありません。 – RBerteig
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
上記のTHC4kのソリューションもファイルに対して動作します。ファイルがabc.luaと呼ばれる場合、require( 'abc')が機能します。 – jameszhao00
はい、ただし、dofile "/home/lhf/scripts/abc.lua"を実行している場合は表示されません。 – lhf
実際にあなたは 'require" /path/to/file.lua "' – nonchip
が、package
を利用し、あなたも一度これを行うことができます:
package.preload["something"]=dofile "/path/to/your/file.lua"
をその後、
と使用:
local x=require "something"
再びプリロードされたパッケージを取得します。それはちょっと乱暴です...
"luaファイルをどうやって"ってどういう意味ですか? –
私は現在、1つのファイルの複数の場所からdofile()を使用しています。 – jameszhao00
私はいつも 'dofile'の前に' require'を優先したいと思います。ただし、各呼び出しでファイル全体を明示的に*実行したい場合を除きます。* – nonchip