Из вашего ответа на мой комментарий я предполагаю, что вы сохраняете экземпляр 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();
Это напечатает 2x «QVariant (double, 21)» и один раз «QVariant (double, 1)». Это ожидаемое поведение, вот почему:
В JavaScript все является объектом, и вы имеете дело только с ссылками на объекты, а не на сами объекты (если вы знаете Java, это похоже на int
против Integer
) , Таким образом, присваивание result = anotherVar + 7;
заменяет объект, представленный myvar
как свойство «результата» глобального объекта, объектом, который получается из выражения anotherVar + 7
. Между тем, QScriptValue myvar
все еще ссылается на (старый) объект, который в противном случае был бы доступен для сборщика мусора.
О добавлении a=1
для решения проблемы: я не могу воспроизвести это здесь. Первый оператор отладки печатает значение a
, конечно, но второй и третий неизменны.
Поэтому решение вашей проблемы состоит в том, чтобы всегда получать свойство «result» из движка всякий раз, когда вам это нужно (используя engine.globalObject().property("result")
), или, другими словами, QScriptValue не отслеживает назначения.
Если вы делаете хотите отслеживать назначение, вам нужно превратить его в вызов метода: реализовать result
как пользовательский класс с методом assign()
и заменить назначение (=
) с result.assign( anotherVal + 7 );
.