DEV Community

Armando Picón
Armando Picón

Posted on

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)
Enter fullscreen mode Exit fullscreen mode

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 )
Enter fullscreen mode Exit fullscreen mode

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)
}
Enter fullscreen mode Exit fullscreen mode

Con la función of ganamos un poco de legibilidad a la creación de un objeto.

    val sagittariusGoldenSaint = Saint. AIOROS.of(ZodiacSign. SAGITTARIUS )
Enter fullscreen mode Exit fullscreen mode

Podríamos mejorarla un poco más mediante la importación estática de cada elemento.

    val sagittariusGoldenSaint = AIOROS.of( SAGITTARIUS )
Enter fullscreen mode Exit fullscreen mode

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)
}
Enter fullscreen mode Exit fullscreen mode

¿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
Enter fullscreen mode Exit fullscreen mode

¿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 y compartelo con tus amigos.

Me puedes encontrar en Twitter, Github y LinkedIn.


Top comments (0)