Sobes.tech
Junior

¿Qué funciones de ámbito en Kotlin conoces?

sobes.tech AI

Respuesta de la IA

  • let: Ejecuta un bloque de código en un objeto y devuelve el resultado de la última expresión. Se usa a menudo para llamadas seguras a métodos en objetos nulos.
  • run: Tiene dos variantes:
    • Como función de extensión: Ejecuta un bloque de código en el objeto (this) y devuelve el resultado de la última expresión.
    • Como función independiente: Ejecuta un bloque de código sin receptor y devuelve el resultado de la última expresión.
  • with: Ejecuta un bloque de código en un objeto receptor proporcionado como argumento y devuelve el resultado de la última expresión.
  • apply: Ejecuta un bloque de código en un objeto (this) y devuelve el propio objeto. Se usa a menudo para configurar propiedades del objeto.
  • also: Ejecuta un bloque de código en un objeto (it) y devuelve el propio objeto. Se usa para realizar acciones secundarias en el objeto.
// Ejemplo de uso de let
val name: String? = "Kotlin"
val length = name?.let {
    // this == null
    // it == "Kotlin"
    it.length // Devuelve la longitud de la cadena
} // length == 6

// Ejemplo de uso de run como extensión
val numbers = mutableListOf(1, 2, 3)
val firstAndLast = numbers.run {
    listOf(first(), last())
    // this == numbers
} // firstAndLast == [1, 3]

// Ejemplo de uso de run como función independiente
val result = run {
    // Sin receptor
    println("Ejecutando un bloque")
    1 + 2 // Devuelve 3
} // result == 3

// Ejemplo de uso de with
val configuration = configureUsing {
    // this - objeto pasado a configureUsing
    width = 100
    height = 200
}

fun configureUsing(builder: ScopeExample.() -> Unit): ScopeExample {
    val example = ScopeExample()
    example.builder()
    return example
}

class ScopeExample {
    var width: Int = 0
    var height: Int = 0
}

// Ejemplo de uso de apply
val person = mutableListOf<String>().apply {
    // this == lista
    add("Alice")
    add("Bob")
} // person == ["Alice", "Bob"]

// Ejemplo de uso de also
val list = mutableListOf(1, 2, 3)
val doubledList = list.also {
    // it == lista
    println("Procesando lista: $it")
}.map { it * 2 } // doubledList == [2, 4, 6]