2013-03-23 12 views
7

E 'possibile non importare un implicito dal repl?Come può un implicito essere non importato dalla Scala repl?

dire fare qualcosa di simile,

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 

e poi decidere che era tutto un grosso errore. Come posso rimuovere quelli impliciti dall'ambito corrente?

La mia tecnica attuale sta interrompendo il REPL e quindi ne avvio uno nuovo, sono ansioso di evitare di ripeterlo.

risposta

10

È possibile nascondere un implicito creando un altro implicito con lo stesso nome. Fortunatamente (per questo caso, comunque), piuttosto che avere un implicito sovraccarico, il nuovo sostituisce il vecchio:

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

Ha. Bello. Immagino che questo significhi unimport non è possibile. Invece di aggiungere un tratto, ho ottenuto lo stesso vantaggio con 'implicit def int2bool = Unit' –

+0

@DanMidwood - Probabilmente si intende' implicit def int2bool =() ', sebbene il mio punto sia proprio che tutto funziona. Ho fatto un nuovo tratto per essere sicuro che qualunque cosa fosse implicitamente fornita non sarebbe ricercata da nessuna parte. ("= Unità" significa "restituisce l'oggetto compagno al tipo" Unità ", il valore univoco" Unità ",'() ', potrebbe essere implicitamente ricercato da qualche parte, ma è meno probabile che l'oggetto associato sia ricercato.) –

+0

Hai ragione: stavo mirando a() e non per l'oggetto companion.Il mio vero obiettivo era quello di avere qualcosa che non corrispondesse a nulla, ma ora sono meno sicuro delle mie supposizioni sull'Unità di avere fiducia in questo Ho un sacco di cose da imparare, grazie per il tuo aiuto –

Problemi correlati