Это потому, что цикл for
был определен таким образом в Спецификации языка Java .
BasicForStatement:
for ( ForInit ; Expression ; ForUpdate ) Statement
ForStatementNoShortIf:
for ( ForInit ; Expression ; ForUpdate ) StatementNoShortIf
ForInit:
StatementExpressionList
LocalVariableDeclaration
ForUpdate:
StatementExpressionList
StatementExpressionList:
StatementExpression
StatementExpressionList , StatementExpression
Таким образом, он должен быть StatementExpression
или кратным StatementExpression
с, а StatementExpression
определяется как:
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
0 <= n ? (i++) : (i--)
не относятся к числу таких, поэтому они не принимаются. i += ((0 <= n) ? 1 : -1)
- это задание, поэтому оно работает.
Один довольно уродливый прием, который я рассмотрел, - это использовать addToJavaScriptWindowObject, чтобы отбросить объект, который я хочу вернуть, в объект окна со случайным именем, а затем заставить мой слот возвращать имя экземпляра объекта вместо этого:
QString MyApp::helloWorld()
{
//general a unique name for the js variable
QString name=getRandomVariableName();
//here's the object we want to expose to js
MyObject* pReturn=new MyObject();
//we make attach our object to the js window object
getWebFrame()->addToJavaScriptWindowObject(name, pReturn,
QScriptEngine::ScriptOwnership);
//tell js the name we used
return name;
}
JS может быть написан, чтобы проверить, является ли возвращаемое значение строкой, и если это так, захватить объект из окна.:
var foo=myapp.helloWorld();
if (typeof foo == "string")
{
foo=window[foo];
}
Немного уродливо, но я справлюсь, пока не появится лучший метод вместе. В будущих версиях Qt будет унифицирована поддержка сценариев, чтобы все они были основаны на JavaScriptCore в WebKit, так что, надеюсь, это улучшится!
QtScript имеет понятие прототипов, которое позволяет вам создавать прототип C ++ для значения скрипта. Мы исследуем, можем ли мы связать QtScript с JavaScriptCore - что должно привести к возможности использования прототипов из среды JavaScript WebKit; http://doc.trolltech.com/4.5/qtscript.html#making-use-of-prototype-based-inheritance
Попробуйте вернуть ваш новый объект как QObject *, а не как MyObject *. Если вы просто работаете с QtScript, вы можете вызвать qScriptRegisterMetaType , чтобы определить код для обработки преобразования MyObject * в QScriptValues (или QVariants), но, похоже, нет эквивалента для Механизм JavaScript, используемый в QtWebKit.
К сожалению, это означает, что предоставление вашей внутренней объектной модели WebKit потребует либо наличия отдельного набора прокси-функций, которые преобразуют указатели ваших объектов в QObject * s, либо использования классов адаптеров какого-либо типа для выполнения то же самое.