2015-09-20 56 views
0

假設我有兩個特定的object從中檢索導入。假定這兩個對象都有我想要使用的多個有用的導入。我只包括1這個例子簡單:在編譯時指定法律和/或非法含義?

scala> object Implicits1 { implicit def good: String => Int = _ => 42 } 
defined object Implicits1 

scala> object Implicits2 { implicit def bad: String => Int = _ => 666 } 
defined object Implicits2 

然後,給出foo

scala> def foo(x: Int): Int = x 
foo: (x: Int)Int 

我作通配符進口獲得implicits:

scala> import Implicits1._ 
import Implicits1._ 

scala> import Implicits2._ 
import Implicits2._ 

上運行foo(".") REPL顯示Implicits2.bad的隱含已解決:

scala> foo(".") 
res0: Int = 666 

但是,我其實想要Implicits1.good,而不是Implicits2.bad

som-snytt和Shadowlands教育我如何處理通配符導入 - Wildcard Import, then Hide Particular Implicit?

但是,我可以在編譯時指定允許或禁止特定含義嗎?

回答

2

在REPL中測試會給出錯誤的結果。如果你有一個文件導入,你會得到一個模糊的隱含錯誤。除了這個

我可以在編譯時指定特定implicits允許

導入。

或被禁止

不要導入。如果

兩個對象,我想用

多,有用的進口,那麼你可以說"import everything except these specific identifiers"

import Implicits2.{bad => _, bad2 => _, _} 

如果帶來了一個隱含的進入範圍內,只有通過陰影才能禁用它,如鏈接問題。