Kotlin - ¿Funciones como operadores aritméticos? Sí, con Infix functions
Tags: kotlin, android, functional
Published: 2019-06-11 14:32:40

![](https://cdn-images-1.medium.com/max/1024/1*MCU8J5-roudxIIYt1U1J1A.jpeg)

#### 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_](https://medium.com/makingtuenti/infix-functions-in-kotlin-2db3d3142dd2)_” 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)](https://es.wikipedia.org/wiki/Notaci%C3%B3n_de_infijo).

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_](https://medium.com/@devpicon/android-java-y-si-le-agregamos-funciones-a-la-clase-con-kotlin-346518595c3#.exrerpaht) 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**](https://medium.com/kotlin-dev-reactor).

#### Referencias:

- [Infix functions in Kotlin — Making Tuenti](https://medium.com/makingtuenti/infix-functions-in-kotlin-2db3d3142dd2)
- [Notación de infijo](https://es.wikipedia.org/wiki/Notaci%C3%B3n_de_infijo)
- [Infix notation — Kotlin Programming Language documentation](https://kotlinlang.org/docs/reference/functions.html#infix-notation)

> ¡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](http://twitter.com/@DevPicon), [Github](http://github.com/DevPicon) y [LinkedIn](https://www.linkedin.com/in/armandopicon/).

* * *