0

我正在使用来自 Spotify 的 Scio 库的宏注释。我想定义一个String类型的变量并像这样注释:

val schemaString = """schema here"""
@BigQueryType.fromSchema(outputString) class BigQuery

这不会编译,但是,如果我String直接注释,它可以工作:

@BigQueryType.fromSchema("""schema here""") class BigQuery

看代码,这个匹配到这里就完成了,本质上代码如下:

def str(tree: c.Tree) = tree match {
      // "string literal"
      case Literal(Constant(s: String)) => s
      // "string literal".stripMargin
      case Select(Literal(Constant(s: String)), TermName("stripMargin")) => s.stripMargin
      case _ => c.abort(c.enclosingPosition, errorMessage)
    }

问题是为什么这与变量不匹配,但字符串匹配?如果有任何方法可以使第一个示例工作?

4

1 回答 1

4

问题是在编译时执行宏时字符串变量的值可能不可用。如果是:

val schemaString = doSomeComplexFunction()
@BigQueryType.fromSchema(schemaString) class BigQuery

理论上,也许宏可以搜索 val 的定义位置并允许它工作,如果它只是分配了一个字面值,但如果你开始考虑范围,即使这样也会变得复杂。

所以不,可能没有办法让第一个例子工作。

于 2017-08-10T22:58:57.123 回答