Inicio > Sin categoría > La funcion implicitly

La funcion implicitly

En un post anterior hablábamos sobre el método to invocado sobre un entero para generar un Range. A pesar de que la clase Int no define un método to es posible hacer esta invocación en virtud de una conversión implícita de Int a RichInt, siendo esta ultima la clase que define el método en cuestión. Las conversiones implícitas son un mecanismo poderoso de Scala que permite, entre otras cosas, el uso/patrón pimp my library.

Sin embargo, el uso de conversiones implícitas puede hacer el código menos inteligible, al no estar siempre claro que conversiones entran en juego; de ahí su nombre, estas conversiones no son tan visibles como el código explicito que escribe el programador. Las conversiones implícitas pueden entrar en acción de manera aparentemente imprevisible, lejos del código donde fueron definidas. Una herramienta que podemos utilizar para aliviar este problema es la función de Scala implicitly.

scala> 1 to 5
res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)

scala> implicitly[Int => { def to(i: Int): Range }]
res1: Int => AnyRef{def to(i: Int): Range} =

scala> res1(1)
res2: AnyRef{def to(i: Int): Range} = 1

scala> res2.getClass
res3: java.lang.Class[_ <: AnyRef] = class scala.runtime.RichInt

scala> res2.to(5)
res4: Range = Range(1, 2, 3, 4, 5)

En este caso la función implicitly (invocada usando ‘[' y ']‘) acepta como parámetro una especificación de la conversión solicitada. Por tanto le pasamos

Int => { def to(i: Int): Range }

cuya traducción sería:

conversion de Int a una clase que defina un método to, que al pasarle un Int devuelva un Range

Como vemos en la sesión interactiva, esta invocación es exitosa al devolver una función que realiza esta conversión. Luego aplicamos esta conversión al literal 1 (RichInt), que nos devolverá un objeto de una clase que tendra el método deseado, to. Aqui es donde se clarifica la situación, puesto que podemos saber cual es la clase mediante la cual es posible invocar le método deseado. En este caso es efectivamente RichInt, cosa que sabíamos de antemano. Pero en general, esta técnica nos permite entender que esta pasando y que clases están interviniendo al entrar en acción una conversión implícita. Finalmente, vemos que el resultado de invocar to es el mismo que en la primera linea.

Referencias

http://stackoverflow.com/questions/3855595/scala-function-implicitly

About these ads
Categorías:Sin categoría
  1. Aún no hay comentarios.
  1. Aún no hay trackbacks

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

%d bloggers like this: