Trabajando algunas cosas como operadores
Esta es una adaptación libre basado en el artículo en inglés “Infix functions in Kotlin — Making Tuenti” escrito por Arturo Gutierrez.
Cuando escribes una función regular o una Extension Function, es posible emplearlas con la notación de infijo (o infix notation en inglés).
Vamos a armar un breve ejemplo que nos ayude a entender los infix functions.
Definamos algunos enumeradores y una clase:
enum class ZodiacSign {
ARIES, TAURUS, GEMINI, CANCER, LEO, VIRGO, LIBRA,
SCORPIO, SAGITTARIUS, CAPRICORN, AQUARIUS, PISCES
}
enum class Saint {
MU, ALDEBARAN, SAGA, KANON, DEATHMASK, AIORIA, SHAKA, DOHKO,
MILO, AIOROS, SHURA, CAMUS, AFRODITA
}
data class GoldenSaint( val saint : Saint, val zodiacSign : ZodiacSign)
Los nombres son muy explícitos, pero por si las dudas, se refiere a los signos zodiacales y los nombres de los caballeros dorados de un conocido dibujo japonés llamado “Caballeros del Zodiaco” (o Saint Seiya).
Si precisaramos crear un nuevo objeto la sintaxis habitual sería la siguiente:
val virgoGoldenSaint = GoldenSaint(Saint. SHURA, ZodiacSign. VIRGO )
La idea es simplificar la forma de crear un nuevo objeto agregando una función al enum class Saint.
enum class Saint {
MU, ALDEBARAN, SAGA, KANON, DEATHMASK, AIORIA, SHAKA,
DOHKO, MILO, AIOROS, SHURA, CAMUS, AFRODITA;
fun of(zodiacSign: ZodiacSign) = GoldenSaint( this, zodiacSign)
}
Con la función of ganamos un poco de legibilidad a la creación de un objeto.
val sagittariusGoldenSaint = Saint. AIOROS.of(ZodiacSign. SAGITTARIUS )
Podríamos mejorarla un poco más mediante la importación estática de cada elemento.
val sagittariusGoldenSaint = AIOROS.of( SAGITTARIUS )
Hasta allí va luciendo mejor, pero aún se podría mejorar. Para ello le agregaremos la palabra reservada infix previo al nombre de nuestra función de esta manera:
enum class Saint {
MU, ALDEBARAN, SAGA, KANON, DEATHMASK, AIORIA,
SHAKA, DOHKO, MILO, AIOROS, SHURA, CAMUS, AFRODITA;
infix fun of(zodiacSign: ZodiacSign) = GoldenSaint( this, zodiacSign)
}
¿Y qué conseguimos con ello? Darle a la función una forma similar a la de un operador aritmético tal como lo podemos ver a continuación:
val sagittariusGoldenSaint = AIOROS of SAGITTARIUS
¿Luce mejor verdad? Esto constituye un acercamiento a un lenguaje más natural haciendo nuestro código más legible y conciso.
Consideraciones
Algunas consideraciones para aplicar infix son las siguientes:
- Puede aplicarse a extension functions y funciones de clase.
- La función solo puede recibir un único parámetro.
P.D.
Puede encontrar más artículos sobre Kotlin en la publicación Kotlin Dev Reactor.
Referencias:
- Infix functions in Kotlin — Making Tuenti
- Notación de infijo
- Infix notation — Kotlin Programming Language documentation
¡Gracias por leer el artículo, significa mucho para mi! Si lo disfrutaste o fue de utilidad por favor recomiéndalo y compartelo con tus amigos.
Top comments (0)