Cuándo usar run, let, apply, also y with en Kotlin? Ejemplos y explicación
¡Hola a todos! Acabo de empezar a aprender Kotlin después de Java, y las funciones de ámbito (scope functions): run, let, apply, also y with me tienen muy confundido. Leí la documentación, pero aún así no entiendo cuándo usar cada una.
Por ejemplo, a menudo veo este código:
```kotlin
val numbers = mutableListOf("one", "two", "three")
numbers.let { println(it) }
numbers.apply { add("four") }
numbers.run { println("Size: $size") }
```
Pero, ¿por qué no puedo simplemente escribir `println(numbers)` o `numbers.add("four")`? ¿Cuál es la diferencia entre `let` y `apply`? ¿Y para qué sirve `also`?
También intenté inicializar un objeto con configuración:
```kotlin
val person = Person().apply {
name = "John"
age = 30
}
```
Esto funciona, pero lo mismo se puede hacer con `with`:
```kotlin
val person = with(Person()) {
name = "John"
age = 30
this
}
```
¿Cuál es la diferencia? ¿Y cuándo usar `run` en lugar de `apply`?
Agradecería reglas claras y ejemplos para cada función.