为 QScriptEngine 重新定义“print()”函数时返回“未定义值”有什么意义?答案

您所在的位置:网站首页 cs是什么函数 为 QScriptEngine 重新定义“print()”函数时返回“未定义值”有什么意义?答案

为 QScriptEngine 重新定义“print()”函数时返回“未定义值”有什么意义?答案

#为 QScriptEngine 重新定义“print()”函数时返回“未定义值”有什么意义?答案| 来源: 网络整理| 查看: 265

返回undefinedValue()并不是必须的,但是当你这样做时,它与不返回任何东西是一样的。或者本质上,就好像您将函数声明为void print(...),可以这么说。

这就是QtPrintFunction 所做的——它返回“无”。但它确实有一个副作用,即无论何时调用它,都将其参数附加到内部数据对象。这就是为什么您会在 output 对象中获得所有传递给 print 的值。

现在,当您调用 engine-;evaluate() 时,它会返回 last 评估表达式的值。因此,使用 myPrintFunction 您只能获得 last 值。

所以,如果您要输入以下内容:

print("Stack"); print("Overflow"); "garbage";

你只会得到garbage(双关语),因为这是最后评估的表达式。

但是,如果你输入这个:

print("Stack") + '\n' + print("Overflow");

如您所料,您将获得这两个值。

另外,如果你输入:

result = ""; for (i = 0; i < 3; i++) result += print(i) + '\n';

你也会得到你所期望的。

希望这能解释为什么您的函数会如此行事。

但是,我认为这不是您想要实现的目标。所以...继续前进。

您可以做的一件事是定义myPrintFunction,如下所示:

QScriptValue myPrintFunction(QScriptContext *context, QScriptEngine *engine) { static QString result; for (int i = 0; i < context->argumentCount(); ++i) { if (i > 0) result.append(" "); result.append(context->argument(i).toString()); } result.append('\n'); return engine->toScriptValue(result); }

这将按照您预期的方式“工作”。唯一的问题是您无法清除result 的值。如果这对你有用,那么就是这样。

有一个更好的方法可以做到这一点,可能是定义一个类,例如:

class QTrace: public QObject { ... void clear(); void append(const QString& value); const QString& get(); }

并将该类的一个对象传递给fun.setData(engine-;newQObject(trace)),并将您的函数定义为:

QScriptValue myPrintFunction(QScriptContext *context, QScriptEngine *engine) { QString result; for (int i = 0; i < context->argumentCount(); ++i) { if (i > 0) result.append(" "); result.append(context->argument(i).toString()); } result.append('\n'); QScriptValue calleeData = context->callee().data(); QTrace *trace = qobject_cast(calleeData.toQObject()); trace->append(result); return engine->undefinedValue(); }

最后,您可以将 runScript 函数更改为:

trace->clear(); QScriptValue result = engine->evaluate(command); if(result.isError()) output->append(result.toString()); else output->append(trace->get());

或者可能还有其他方法,但希望能帮助你让球朝着正确的方向发展。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3