私のコメントに対するあなたの答えから、私はあなたがQScriptValue myvar
インスタンスを保持していると仮定し、呼び出した後にそれを見てくださいevaluate()
:
QScriptEngine e;
QScriptValue myvar( 1.0 );
e.globalObject().setProperty( "result", myvar );
e.globalObject().setProperty( "anotherVar", QScriptValue( 14 ) );
const QScriptValue s = e.evaluate( "result = anotherVar + 7;" );
qDebug() << s.toVariant();
qDebug() << e.globalObject().property("result").toVariant();
qDebug() << myvar.toVariant();
これにより、「QVariant(double,21)」が 2 回、「QVariant(double,1)」が 1 回出力されます。これは予期される動作です。理由は次のとおりです。
JavaScript では、すべてがオブジェクトであり、オブジェクト自体ではなく、オブジェクトへの参照int
のみを扱います (Java を知っている場合、これはvs.に似ていInteger
ます)。したがって、代入が行うことは、グローバル オブジェクトの「結果」プロパティとしてresult = anotherVar + 7;
表されるオブジェクトを、式の結果であるオブジェクトに置き換えることです。一方、QScriptValueはまだ (古い) オブジェクトを参照しており、そうでなければ、この時点でガベージ コレクターによって取得される可能性があります。myvar
anotherVar + 7
myvar
a=1
問題を修正するための の追加について: ここでは再現できません。a
もちろん、最初の debug ステートメントは の値を出力しますが、2 番目と 3 番目のステートメントは変更されていません。
したがって、問題の解決策は、( を使用してengine.globalObject().property("result")
) 必要なときはいつでもエンジンから「結果」プロパティを常に再取得することです。つまり、QScriptValue は代入を追跡しません。
割り当てを追跡したい場合は、それをメソッド呼び出しに変換する必要があります。メソッドresult
を使用してカスタム クラスとして実装し、割り当て ( ) をassign()
に置き換えます。=
result.assign( anotherVal + 7 );