Scala 宏:分配给变量的字符串文字不匹配
Scala macros: string literal assigned to a variable does not match
我正在使用来自 Spotify 的 Scio 库的宏注释。我想定义一个 String
类型的变量并这样注释:
val schemaString = """schema here"""
@BigQueryType.fromSchema(outputString) class BigQuery
这不会编译,但是,如果我直接注释 String
,它会起作用:
@BigQueryType.fromSchema("""schema here""") class BigQuery
看代码,这样匹配就完成了here,本质上代码如下:
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)
}
问题是为什么这个不匹配变量,但是匹配字符串呢?如果有任何方法可以使第一个示例起作用?
问题是当执行宏时,字符串变量的值可能在编译时不可用。如果是:
val schemaString = doSomeComplexFunction()
@BigQueryType.fromSchema(schemaString) class BigQuery
理论上,也许宏可以搜索 val 的定义位置,如果它只是分配了一个字面值,则允许它工作,但如果您开始考虑范围,即使这样也会变得复杂。
所以不,可能无法让第一个示例起作用。
我正在使用来自 Spotify 的 Scio 库的宏注释。我想定义一个 String
类型的变量并这样注释:
val schemaString = """schema here"""
@BigQueryType.fromSchema(outputString) class BigQuery
这不会编译,但是,如果我直接注释 String
,它会起作用:
@BigQueryType.fromSchema("""schema here""") class BigQuery
看代码,这样匹配就完成了here,本质上代码如下:
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)
}
问题是为什么这个不匹配变量,但是匹配字符串呢?如果有任何方法可以使第一个示例起作用?
问题是当执行宏时,字符串变量的值可能在编译时不可用。如果是:
val schemaString = doSomeComplexFunction()
@BigQueryType.fromSchema(schemaString) class BigQuery
理论上,也许宏可以搜索 val 的定义位置,如果它只是分配了一个字面值,则允许它工作,但如果您开始考虑范围,即使这样也会变得复杂。
所以不,可能无法让第一个示例起作用。