2013-03-23 93 views
7

是否可以从repl中取消导入隐式?如何从Scala 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 

然后再决定,这是所有的一个大错误。我如何从当前范围中删除这些含义?

我目前的技术是中止REPL,然后开始一个新的,我很想避免重复它。

回答

10

您可以通过创建具有相同名称的另一个隐式来隐藏隐式。幸运的是(对于这种情况,无论如何),而不是有一个超负荷的隐含,新的取代旧的:

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) 
+0

哈。尼斯。我想这意味着unimport是不可能的。而不是增加一个特性,我得到了与隐式def int2bool =单元' – 2013-03-23 23:19:39

+0

@DanMidwood相同的好处 - 你可能意指'隐式def int2bool =()',虽然我的观点是真的那个_anything_的作品。我做了一个新的特性,确保任何隐含提供的内容都不会在任何地方被需要。 ('= Unit'意思是“将伴随对象返回给'Unit'类型;唯一的'Unit'值,'()'可能在某处隐含地被需要,但是它不太可能需要伴随对象。 – 2013-03-23 23:44:20

+0

你是对的,我的目标是()而不是伴侣对象,我的真正目标是找到一些与任何东西都不匹配的东西,但现在我不太确定我对Unit有信心的假设。我有很多学习要做,谢谢你的帮助 – 2013-03-23 23:55:22