2016-10-27 12 views
2

私は、プロジェクト鉱山の設定フォーマットとしてLuaを使用しています。のは、私は以下の不自然な例を持っているとしましょう、私たちはconf.lua呼ぶことにします:特定のスコープでロードされたLuaファイルを実行する

title = "Lorem Ipsum" 
author = "John Doe" 
date = "01 January 2000" 

を今、自明、私はもちろんそうのように、このファイルを読み込むことができます。

dofile("conf.lua") 

しかし、これで問題がありますこれらの定義はグローバルな名前空間に設定されていますが、これは私が望まないものです。さらに、全体として異なる変数にアクセスすることを困難にする(例えば、構成変数のセットをループする)。一つの解決策はそうのようなconf.luaを書き換えることであろう。

local conf = { 
    title = "Lorem Ipsum", 
    author = "John Doe", 
    date = "01 January 2000" 
} 

return conf 

と順番に、次のコードで負荷conf.lua

local configuration = dofile("conf.lua") 

はしかし、これは私が明白な理由を考えるために非理想的です。私のユーザーは、最後にテーブルを返すことを覚えておくために、localと書く必要があるため、カンマを追跡する必要があります。いくつかのソートのカスタムスコープでconf.luaを実行させる何らかの方法がある場合は、いいと思います。

答えて

3

dofileの代わりに、loadfileを使用してください。

loadfileあなたがロードされたチャンクがで実行されますenvironmentを指定することができます。空のテーブルとしてこれを設定する上位値は、そのテーブルに配置することができます。それは代わりに、文字列または文字列建物関数から、stdinファイルからチャンクを読み込み、またはそれ以外

local function load_conf() 
    local env = {} 

    local chunk, err = loadfile('conf.lua', 'bt', env) 

    if not err then 
     chunk() 
    end 

    return env, err 
end 

local conf, conf_err = load_conf() 

print(conf_err) 
print(conf.title, conf.author, conf.date) 

loadfileは、loadと同様の規則を使用します。


setfenvLua 5.1との後方互換性のために必要であることに留意されたいです。ロードされたチャンクを実行する前に、次のようなものを使用してください。

if setfenv then 
    setfenv(chunk, env) 
end 

Lua 5.2 Reference Manual§8.1 – Changes in the Languageを参照してください。


は最後に、設定ファイルは、メインプログラムがクラッシュしないように、pcallを使用して、プロテクトモードであなたのチャンクを実行することを検討します。

関連する問題