#Kotlin - ¿Funciones como operadores aritméticos? Sí, con Infix functions
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 mediante el ícono del corazón ❤ y compartelo con tus amigos.