方法调用语法限制
x.f 中的表达式 x 需要进行语义检查(即符号查找和类型检查),然后才能确定需要将其重写为 f(x) 。 因此,当用于调用模板/宏时,点语法有一些限制:
- template declareVar(name: untyped) =
- const name {.inject.} = 45
- # 不能编译:
- unknownIdentifier.declareVar
另一个常见的例子是:
- from sequtils import toSeq
- iterator something: string =
- yield "Hello"
- yield "World"
- var info = something().toSeq
这里的问题是编译器已经决定 something() 作为迭代器在 toSeq 将其转换为序列之前不可调用。