通配符导入,然后隐藏特定隐含?

时间:2015-09-18 21:58:28

标签: scala implicit

给出以下具有2个含义的对象:

scala> object Foo {
     |  implicit def stringToInt(x: String) = 555
     |  implicit def stringToBoolean(x: String) = true
     | }
warning: there were two feature warnings; re-run with -feature for details
defined object Foo

我可以使用它们:

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

scala> import Foo._
import Foo._

scala> f("asdf")
res0: Int = 555

scala> def g(b: Boolean) = b
g: (b: Boolean)Boolean

scala> g("asdfasdf")
res1: Boolean = true

然后,我尝试禁用stringToInt隐式。

scala> import Foo.{stringToInt => _}
import Foo.{stringToInt=>_}

但是,显然,这不起作用。

scala> f("adsfasdf")
res2: Int = 555

在通配符导入含义之后,是否可以隐藏它们?

基本上,我想使用所有Foo的隐含,减去一个stringToInt

注意 - 当然我只能做import Foo.stringToBoolean,但是,对于我的场景,Foo有~25个导入,我想使用其中的24个。因此,使用all更简洁,然后减去一个。

2 个答案:

答案 0 :(得分:3)

REPL只是近似从历史中导入的内容,并且一个近似值总是使用导入的含义。

在普通代码中,您可以通过遮蔽标识符来禁用隐式。

最佳镜头是:

scala> object X { val stringToInt = 0 }
defined object X

scala> import X._
import X._

scala> f("asdf")
<console>:20: error: type mismatch;
 found   : String("asdf")
 required: Int
       f("asdf")
         ^

scala> implicit val stringToInt = 0
stringToInt: Int = 0

我们的想法是将阴影变量引入当前行的REPL模板范围。

答案 1 :(得分:2)

现有语法禁止特定导入。它是重命名/别名导入语法的扩展:

import scala.collection.concurrent.{ Map => CMap } // Import concurrent Map, but alias it to "CMap", so the predef-imported "Map" isn't shadowed.

要隐藏导入,您可以将其别名为&#34; _&#34;:

import scala.collection.mutable.{ Map, TrieMap => _ } // Import Map, but not TrieMap

同样,要导入除特定条目之外的所有对象,请使用:

import Foo.{ stringToInt => _, _ }

scala> def g(b: Boolean) = b
g: (b: Boolean)Boolean

scala> g("asdfasdf")
res1: Boolean = true

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

scala> f("asdf")
<console>:13: error: type mismatch;
 found   : String("asdf")
 required: Int
              f("asdf")
                ^