2017-08-10 125 views
0

我正在使用來自Spotify的Scio庫的宏註釋。我想定義String類型的變量和註釋是這樣的:Scala宏:分配給變量的字符串文字不匹配

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) 
    } 

的問題是,爲什麼這個不匹配變量,但字符串?如果有什麼方法可以使第一個例子工作?

回答

3

問題是,在執行宏時,字符串變量的值在編譯時可能不可用。如果它是:

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

從理論上講,也許宏可以搜索VAL被定義在那裏,並允許它的工作,如果它只是分配一個字面值,但即使這樣,如果你開始覺得可能會很複雜關於範圍。

所以不,可能沒有辦法讓第一個例子工作。