#Kotlin - ¿Funciones como operadores aritméticos? Sí, con Infix functions

Trabajando algunas cosas como operadores

Armando Picón
DevPicon by Armando

--

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:

¡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.

Me puedes encontrar en Twitter, Github y LinkedIn.

--

--

Armando Picón
DevPicon by Armando

lifelong learner • 👨🏽‍💻 Android eng (ex: @uber ) • 🇵🇪 @ 🇨🇱 • @gdgopen • content creator @devpicon | @primosauda