我正在尝试eval在 nim 中执行与Python 中的方法等效的方法。我的印象是parseStmt从macros包中应该可以帮助我解决这个问题,但我正面临一个我不明白的编译问题。
import macros
echo parseStmt("1 + 2")
Run Code Online (Sandbox Code Playgroud)
我本来希望它3在执行时打印出来,但编译却抱怨说
Error: request to generate code for .compileTime proc: $
Run Code Online (Sandbox Code Playgroud)
我找到了这个线程,那里的例子有效,在此之后,我能够使以下程序按我的预期工作:
import macros
import strformat
macro eval(value: string): untyped =
result = parseStmt fmt"{value}"
echo eval("1+2")
Run Code Online (Sandbox Code Playgroud)
但我完全不明白为什么它需要以这种方式编写。如果我内联语句, let value = "1 + 2"; echo parseStmt fmt"{value}",我会得到与上面相同的编译错误。
另外,为什么parseStmt value与parseStmt fmt"{value}", 在上述eval宏的上下文中不同?
我在这里缺少什么?
预先感谢您的任何澄清!
我正在将 Pyside2 与 QML 一起使用,并尝试对我的代码进行良好的组织。我要揭露一个子类MyModel的QAbstractListModel从Python来QML,在使用ListView。如果我MyModel直接在引擎内部声明实例,则代码完美运行:
...
engine = QQmlApplicationEngine()
myModel = MyModel(some_dict)
engine.rootContext().setContextProperty("myModel ", myModel)
...
Run Code Online (Sandbox Code Playgroud)
然后我可以使用它:
ListView {
model: myModel
delegate: Row {
Text { text: name }
Text { text: type }
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将这个元素定义Property为一个类时,为了保持整洁而不是到处注册模型,我似乎无法让它工作。我无法从 qml 恢复良好的调试信息,这也无济于事。
我试图声明以下内容
ListView {
model: myModel
delegate: Row {
Text { text: name }
Text { text: type }
}
}
Run Code Online (Sandbox Code Playgroud)
然后在qml中使用它
ListView {
model: modelProvider.myModel
// or model: modelProvider.myQVariantModel
delegate: Row …Run Code Online (Sandbox Code Playgroud)