Pílula K#06 — Funções Infixas

Klaus Dellano
HavanLabs
Published in
3 min readNov 7, 2023

Você já ouviu falar em funções infixas em Kotlin? Nesta dose, vamos dar uma olhada em mais uma das frescuras legais do Kotlin, como as funções infixas funcionam e fornecer vários exemplos para ajudá-lo a começar.

O que são funções infixas?

As funções infixas são uma maneira de chamar uma função com uma sintaxe especial (pra você que quer ser o diferentão do time).

Para definir uma função infix, você precisa marcá-la com a palavra-chave infix. Isso permite que você chame uma função como se fosse um operador.

Por exemplo, se você tem uma função chamada adicionar, você pode definir essa função como infix e, em seguida, usar a notação infix para chamar a função como se fosse um operador de adição:

infix fun Int.adicionar(outro: Int): Int {
return this + outro
}

fun main() {
val resultado = 1 adicionar 2
println(resultado)
}

/*Saída
3
*/

// E é a mesma coisa coisa que: 1.adicionar(2)

Observe como definimos uma função adicionar na classe Int usando a palavra-chave infix. Isso nos permite usar a função adicionar com a notação infix 1 adicionar 2.

Dahora neh? fala a verdade! É frescura? Sim, é! Mas temos que concordar que pode tornar o código mais legível e expressivo.

Exemplos de funções infixas

Comparação de valores

infix fun Int.éMenorQue(outro: Int): Boolean {
return this < outro
}

fun main() {
val resultado = 1 éMenorQue 2
println(resultado)
}

/*Saída
true
*/

Concatenação de Strings

infix fun String.concatenar(outro: String): String {
return this + outro
}

fun main() {
val resultado = "Pílula #" concatenar "6 - Funções Infixas"
println(resultado)
}

/*Saída
Pílula #6 - Funções Infixas
*/

Operações matemáticas

infix fun Int.multiplicarPor(outro: Int): Int {
return this * outro
}

fun main() {
val resultado = 2 multiplicarPor 3
println(resultado)
}

/*Saída
6
*/

Funções de extensão em classes personalizadas

class Pessoa(val nome: String, val idade: Int)

infix fun Pessoa.temIdadeMaiorQue(outro: Pessoa): Boolean {
return this.idade > outro.idade
}

fun main() {
val pessoa1 = Pessoa("João", 30)
val pessoa2 = Pessoa("Maria", 25)
val resultado = pessoa1 temIdadeMaiorQue pessoa2
println(resultado)
}

/*Saída
true
*/

Dicas

  • Elas só podem ser definidas em membros de extensão ou membros de classe. Isso significa que você não pode usar funções infixas em funções regulares.
  • Elas só podem ter um parâmetro. Isso significa que você não pode usar funções infixas em funções que exigem mais de um parâmetro.
  • Tem precedência menor que os operadores aritméticos, conversões de tipo (cast) e operador rangeTo…
    5 operadorInfixA 3 + 2 é o mesmo que 5 operadorInfixA (3 + 2)
    3 operadorInfixB 4 + 6 é o mesmo que 3 operadorInfixB (4 + 6)
    x operadorInfixC y as List<*> é….. x operadorInfixC (y as List<*>)
  • Tem precedência maior que operadores booleanos, verificação de existência e outros operadores
    x && b operadorInfixD c é…. x && (b operadorInfixD c)
    x operadorInfixE b in c é… (x operadorInfixE b) in c

Uma boa dose, né não? A notação infixa é uma maneira elegante de escrever tornando seu código mais legível e expressivo. Agora que viu vários exemplos de funções infixas e algumas dicas, vai lá e escreve algumas “inFunções” (… ok, parei)!

E para a próxima dose, somente com uma "condição": Está curtindo essas pílulas? Se SIM, só aguardar, SENÃO, comenta o que posso melhorar.

--

--

Klaus Dellano
HavanLabs

Developer Engineer at HAVAN, focusing on Mobile and RFID.