2012-01-19 2 views
0

私はLuaの次のコードを持っている: ABC:Name変数のLUA

test (X) 

テスト機能は、C + 1 +で実装されています。私の問題はこれです:パラメータとして渡された変数名(この場合はX)を知る必要があります。 C + +ではこの変数の値にしかアクセスできませんが、私は彼女の名前を知る必要があります。

ヘルプ

+6

いいえ、必要はありません。別の明確な方法を見つけてください。 – delnan

+2

C++変数は実行時に名前を持ちません。 –

+0

なぜあなたは変数名を知る必要があると思いますか?あなたがしようとしていることの詳細を説明してください。 –

答えて

3

関数は変数に渡されません。それらはに渡されます。変数はちょうどストアのの値です。

あなたはどこか(注意:それはそれよりも実際にはもっと複雑だが、私はここにいるに取得することはできません)変数Xからを取得することを意味し、あなたのLuaのコードでXを言います。

test(X)と言うときは、「変数Xから値を取得し、その値を関数testの最初のパラメータとして渡します。」

変更の内容はX、右ですか? test関数を何らかの方法でXに変更したいとします。さて、本当にLuaで直接行うことはできません。あなたもそうではありません。

ルアでは、関数から値を返すことができます。そして複数の値を返すことができます。 C++コードでも、複数の値を返すことができます。だから、それが何であれ、あなただけ返すことができますXに格納したい:

X = test(X) 

この方法では、関数の呼び出し側が値ではなく、機能自体をどのように処理するかを決定します。呼び出し元が変数を変更したい場合、それは問題ありません。発信者が別の場所に貼り付けたい場合は、それも問題ありません。あなたの機能は、どちらか一方を気にしないでください。

また、ユーザーはtest(5)のような操作を行うことができます。ここでは、です。 を直接渡すだけです。これが、関数が渡される "変数"を変更できない理由の1つです。 を変数にしていないためです。値だけが渡されるので、ユーザーは変数に格納されている値ではなくリテラル値を渡すことができます。

要するに、あなたはそれをすることはできません。そうしたくないのです。

0

あなたが後にしているのは、引数の文字列表現であれば、あなたはluaに固執しています。

私はCのような何かを考えている:

失敗時に素敵なメッセージを生成
assert(x==y); 

。 Cでは、これはマクロを通して行われます。 このようなもの(テストされておらず、おそらく壊れている)。

#define assert(X) if(!(X)) { printf("ASSERION FAILED: %s\n", #X); abort(); } 

ここで、#Xは、引数の文字列形式を意味します。上の例では "x == y"です。これは変数名と微妙に異なることに注意してください - マクロを展開するときにパーサで使用される文字列だけです。

残念ながら、luaには対応する機能はありません。私のLuaのテストライブラリのために私は式の一部として文字列化バージョンを渡してしまうので、LUAに私のコードは次のようになります。

assert(x==y, "x==y") 

文字列のいくつかの種類を使用してassert("x==y")としてこの作品を作る方法があるかもしれませんが評価と閉鎖の仕組みがありましたが、私にとってはやる価値があることは難しいようでした。

EDIT:

これは純粋なLUAで可能であることが表示されませんが、マクロをサポートするように見えるんパッチを当てたバージョンがあります:http://lua-users.org/wiki/LuaMacrosが。彼らはさらに、より良い例のassertを持っています。

1

正しい答えは、Luaはこれを本当にサポートしていないが、デバッグインターフェイスがあるということです。探しているソリューションについては、this questionを参照してください。 C++から直接動作するようにデバッグを呼び出すことができない場合は、最初にデバッグ結果を抽出してC++関数を呼び出すLua関数で関数呼び出しをラップします。

関連する問題