给出以下具有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更简洁,然后减去一个。
答案 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")
^