2010-03-10 8 views

Respuesta

18

funciones implícitas de un argumento se utilizan para convertir automáticamente los valores a un tipo esperado. Estas se conocen como Vistas implícitas. Con dos argumentos, no funciona o tiene sentido.

Se podría aplicar una vista implícito a una TupleN:

implicit def intsToString(xy: (Int, Int)) = "test" 
val s: String = (1, 2) 

También puede marcar la lista parámetro final de cualquier función como implícita.

def intsToString(implicit x: Int, y: Int) = "test" 
implicit val i = 0 
val s: String = intsToString 

O, la combinación de estos dos usos del implicit:

implicit def intsToString(implicit x: Int, y: Int) = "test" 
implicit val i = 0 
val s: String = implicitly[String] 

Sin embargo no es realmente útil en este caso.

ACTUALIZACIÓN

dar más detalles sobre el comentario de Martin, esto es posible.

implicit def foo(a: Int, b: Int) = 0 
// ETA expansion results in: 
// implicit val fooFunction: (Int, Int) => Int = (a, b) => foo(a, b) 

implicitly[(Int, Int) => Int] 
+0

¿Te implicas (:-)) que mi definición original (que no lo hace tiene una lista de parámetros implícita) no se puede invocar implícitamente? (Eso significaría que la palabra clave "implícita" no tiene sentido en mi ejemplo, si ningún código podría observar alguna diferencia). ¿Es realmente el caso? ¿O es esto una respuesta parcial, en el sentido de "hey, al menos estos casos funcionan"? –

+1

Correcto. Sé de qué manera en el lenguaje actual se puede invocar. Una advertencia del compilador podría ser útil para comunicar este hecho. – retronym

+7

La función original no se puede usar como una conversión implícita, ya que toma dos parámetros. Sin embargo, todavía se puede usar como argumento implícito para otro método. Entonces, el modificador "implícito" tiene aquí un significado útil. –

4

respuesta de Jason pierde un caso muy importante: una función implícita con múltiples argumentos, donde todos menos el primero están implícitos ... esto requiere dos listas de parámetros, pero eso no parece estar fuera del alcance dado la forma en que se expresó la pregunta.

He aquí un ejemplo de una conversión implícita que toma dos argumentos,

case class Foo(s : String) 
case class Bar(i : Int) 

implicit val defaultBar = Bar(23) 

implicit def fooIsInt(f : Foo)(implicit b : Bar) = f.s.length+b.i 

ejemplo de sesión de REPL,

scala> case class Foo(s : String) 
defined class Foo 

scala> case class Bar(i : Int) 
defined class Bar 

scala> implicit val defaultBar = Bar(23) 
defaultBar: Bar = Bar(23) 

scala> implicit def fooIsInt(f : Foo)(implicit b : Bar) = f.s.length+b.i 
fooIsInt: (f: Foo)(implicit b: Bar)Int 

scala> val i : Int = Foo("wibble") 
i: Int = 29 
Cuestiones relacionadas