2012-10-04 67 views
1

是否可以使用類型實例作爲正常的Scala類型?例如,在下面的代碼片段中,可以通過使用tpe找到pi從類型實例中查找隱式

import scala.reflect.runtime.universe._ 

implicit val pi: Double = 3.14159265 
val tpe = typeOf[Double] 
implicitly[Double] // pi 
implicitly[tpe]??? 

恐怕沒有一個簡單的解決方案,以實現我的目標,那我將需要一種工廠到TPE轉化爲隱含[雙]。無論如何,我認爲在Scala代碼中集成反射類型可能非常強大,因此,並不像看起來那麼瘋狂。

回答

1

我不明白這會有多大意義。

讓我們來談談它對implicitly意味着什麼。如果沒有這樣的隱含的或者不止一個可用的話,它應該編譯失敗。 但是由於tpe代表的實際類型在運行時才知道,因此使implicitly與類型實例一起工作將使它不可能發出任何類型的編譯錯誤。你可以做的最好的事情是安排任何調用implicitly來總是編譯,讓編譯器在某個地方存儲一個列表中的所有隱式值的列表(對於任何類型),並且在運行時查找這個列表並拋出一個異常,如果沒有匹配由tpe(或者如果有幾個)代表的類型。 如果我們正在討論implicitly的替代實現,比如dynamicImplicitly,這隻能產生某種意義。

請注意,這將需要編譯器的顯式支持(在每次調用dynamicImplicitly時捕獲範圍內的所有含義,因此這不會是一個簡單的函數),並且在空間方面效率非常低許多暗示可能在某個特定點的範圍內?是的,很多,並且每次調用dynamicImplicitly時都需要在字節代碼中以某種方式引用它們。

所以我簡短的回答是:不要屏住呼吸,這個功能很快就會實現。 技術上可能實現dynamicImplicitly作爲一個scala宏(前提是可以從scala宏中獲取所有含義,我甚至不確定)

+0

在宏上下文中,您可以訪問使用'ctx.inferImplicit *'方法將所有的宏隱含在宏的範圍內。我在幾個宏中使用了它們,它們工作得很好,但我沒有想到使用該功能來解決這個問題。明天我會試一試,因爲它有很多意義。謝謝! – jeslg