如何在Scala repl中取消导入隐式?

9

你能在repl中取消导入隐式模块吗?

假设我这样做:

scala> import scala.math.BigInt._
import scala.math.BigInt._

scala> :implicits
/* 2 implicit members imported from scala.math.BigInt */
  /* 2 defined in scala.math.BigInt */
  implicit def int2bigInt(i: Int): scala.math.BigInt
  implicit def long2bigInt(l: Long): scala.math.BigInt

然后决定这是一个巨大的错误。我该如何从当前范围中删除这些 implicits?

我的当前技术是中止 REPL,然后启动一个新的 REPL,我很想避免重复这样做。

1个回答

13

如果创建一个与原隐式变量同名的新的隐式变量,就可以隐藏原来的隐式变量。不过幸运的是(至少对于这种情况而言),新的隐式变量会替代旧的隐式变量,而不是重载旧的隐式变量:

scala> import language.implicitConversions
import language.implicitConversions

scala> def needsBoolean(b: Boolean) = !b
needsBoolean: (b: Boolean)Boolean

scala> implicit def int2bool(i: Int) = i==0
int2bool: (i: Int)Boolean

scala> val dangerous = needsBoolean(0)
dangerous: Boolean = false

scala> trait ThatWasABadIdea
defined trait ThatWasABadIdea

scala> implicit def int2bool(ack: ThatWasABadIdea) = ack
int2bool: (ack: ThatWasABadIdea)ThatWasABadIdea

scala> val safe = needsBoolean(0)
<console>:14: error: type mismatch;
 found   : Int(0)
 required: Boolean
       val safe = needsBoolean(0)

哈。不错。我猜这意味着无法使用unimport。我没有添加trait,而是通过implicit def int2bool = Unit获得了相同的效果。 - Dan Midwood
@DanMidwood - 你可能想说的是 implicit def int2bool = (),不过我的观点是 任何东西 都可以。我创建了一个新的 trait 来确保无论隐式提供的东西在哪里都不会被需要。(= Unit 表示“返回到 Unit 类型的伴生对象;独特的 Unit() 可能会隐含地在某个地方中使用,但较少可能需要伴生对象。) - Rex Kerr
你说得对。我本来是想针对()而不是伴生对象的。我的真正目的是要有一个不匹配任何东西的东西,但现在我对于Unit的假设信心不够了。我还有很多需要学习的地方,感谢你的帮助。 - Dan Midwood
@DanMidwood - 创建一个新的Trait-- IJustMadeThisUp或其他任何名称-- 并且不使用它是确定它不会与任何地方匹配的最安全方法! - Rex Kerr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接