2014-09-05 254 views
1

我有一個Scala(2.10)def宏,參數爲x。它的機身看起來是這樣的:匹配Scala宏中的泛型類型

if (x.actualType =:= typeOf[generic.Type[String]]) { 
    // branch 1: do something with x 
} 
else { 
    // branch 2: do something else 
} 

generic.Type類本身的實現是不可訪問及其執行不能修改。現在,我想讓這個宏調用分支1,而不僅僅是爲generic.Type [String] s,而是generic.Type [T],其中T是任何類型。

有沒有規範的方法來實現這一目標?或者是使用AST手動執行的唯一選擇?

+0

什麼是宏簽名? – Ashalynd 2014-09-05 15:26:54

+0

它是def impl(c:Context)(x:c.Expr [Any]):c.Expr [Any] – fishlips 2014-09-05 15:56:06

回答

2

嘗試x.actualType.typeSymbol == typeOf[generic.Type[_]].typeSymbol

+0

類型表示Scala類型,例如'Foo [Bar]'或者甚至像'Foo forSome {鍵入Bar <:Baz}'。符號表示Scala定義(每個定義只有一個與其關聯的符號)。因此,檢查某些東西(例如某種類型的組件)是否涉及某種定義的正確方法是比較符號。 – 2014-09-06 13:41:27