2017-01-14 7 views
1

LuaからC++にテーブルをロードしようとしています。これは、ファイルの外観です。Luaファイルをロードし、関数を実行せずに変数を使用する

function alma(arg) 
    print(arg) 
end 

sometable = { 
    num = 5, 
    text = "this is a string", 

    nested = { 
    {"a", alma("argument")}, 
    {"table", alma("arg")}, 
    {"element", alma("asd")} 
    } 
} 

私がluaL_loadfileに電話すると、チャンクしか取得できません。私がlua_dofileを呼び出すと、要素が得られますが、各要素に対してalma関数が実行されます。 this SOスレッドでは、誰かがこれらの種類のものを関数にラップし、データを取得するために呼び出すと言いました。関数を3回折り返して呼び出すと、3つのalma関数がgetterを呼び出す瞬間を実行します。 alma関数を実行せずにsometableとその要素を取得するにはどうすればよいですか?

+0

あなたは、そのテーブルにいくつかの要素の遅延評価を実装するために、テーブルの上にメタテーブルを使用することができます。したがって、最初に対応する要素にアクセスした場合にのみ、 'alma'が呼び出されます。この機能は透過的です。明示的に関数を呼び出す必要はありません。 –

答えて

2

と私はそれ故{「いくつかの文字列」、機能}テーブル要素

[OK]を、 一部の機能だろうこれ、GUI要素のonclickイベントをしたいのです、あなたはと呼ばれる機能を必要とします後で。その機能の価値を保存してください。つまり、単にその名前を書きます。

しかし、同じ機能を呼び出して引数を渡したいとします。また、その情報を関数として保存したいとします。だから、テーブルに直接関数を定義し、または他の関数を返します、いくつかの関数を呼び出す、閉鎖にその引数を格納し、次のいずれか

-- function to be called 
function alma(arg) 
    print(arg) 
end 

-- define functions in table 
nested1 = { 
    {"a", function() alma "argument" end}, 
    {"table", function() alma "arg" end}, 
    {"element", function() alma "asd" end} 
} 

-- or create function within another function 
function alma_cb(name) 
    return function() alma(name) end 
end 

nested2 = { 
    {"a", alma_cb "argument"}, 
    {"table", alma_cb "arg"}, 
    {"element", alma_cb "asd"} 
} 
+0

@val、ポイントは関数が値であるということです。名前はありませんが、それを参照する変数またはフィールドがある可能性があります。 –

1

一部の関数を呼び出さずに値を取得することはできません。ロードされたすべてのチャンクは関数です。データではなく、データを構築/返す関数です。これを呼び出す必要があります。グローバル変数を埋めるか、明示的に値を返すようにします。
alma()が呼び出されないようにするには、呼び出さないでください。 alma()に電話することなくテーブルを記入してください。たとえば
:あなたはこのチャンクをロードして呼び出す必要があり

return { 
    num = 5, 
    text = "this is a string", 

    nested = { 
    {"a", "argument"}, 
    {"table", "arg"}, 
    {"element", "asd"} 
    } 
} 

、それが構築し.nestedサブテーブルとテーブルを返し、alma()は呼び出されませんでしょう。

+0

私はそのようなネストされた関数を持つことはできません。そして、ロード時に自動関数呼び出しを避けたいのであれば、データの関数への参照を避けなければなりませんか? – val

+0

XYに問題があるようです。あなたは機能を持っていると主張していますが、呼びたくはありません。あなたの正確な仕事は何ですか?あなたは何を達成したいですか? – Vlad

+0

GUIデータをluaに書いて、C++にロードしたいので、プログラムを再コンパイルしておく必要はありません。ちょっと調整して、gui要素のonClickイベントをいくつか持っていますが、したがって、{"some string"、function}テーブル要素。 – val

関連する問題