reales - Kotlin: ¿Cuál es la diferencia entre Aplicar y también
manual programacion android (3)
además
Definición:
inline fun <T> T.also(block: (T) -> Unit): T (source)
Llama al bloque de funciones especificado con este valor como argumento y devuelve este valor.
aplicar
Definición:
inline fun <T> T.apply(block: T.() -> Unit): T (source)
Llama al bloque de funciones especificado con este valor como su receptor y devuelve este valor.
Diferencia
La función also
recibe una lambda, a la que se pasa T
en la implementación, por lo que dentro de la lambda se hace referencia a ella con un nombre (por defecto).
En la apply
por otro lado, se usa una función literal con receptor , por lo que dentro del lambda pasado no tiene que agregar prefijos adicionales para acceder a sus miembros, como puede ver en su ejemplo. El receptor puede ser referenciado por this
.
cuando usar que
Los ejemplos de uso se explican en este stackoverflow.com/questions/45977011/… .
¿Cuál es la diferencia entre aplicar y también. Por lo que sé el siguiente código hace lo mismo:
aplicar
val person = Person().apply {
name = "Tony Stark"
age = 52
// More such stuff
}
además
val person = Person().also {
it.name = "Tony Stark"
it.age = 52
// More such stuff
}
¿Hay alguna diferencia y debo usar una sobre la otra? Además, ¿hay algunos casos donde uno trabajaría y el otro no?
Las respuestas dadas arriba tienen un poco de sentido, pero no mucho. No lo entiendo correctamente pero quería agregar a la pregunta aquí.
En Standard.kt, esta es la implementación real para los dos métodos.
Para aplicar
/**
* Calls the specified function [block] with `this` value as its receiver and returns `this` value.
*/
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}
Para tambien
/**
* Calls the specified function [block] with `this` value as its argument and returns `this` value.
*/
@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.also(block: (T) -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block(this)
return this
}
Los dos métodos son casi iguales, excepto una línea. Sólo después de pasar por las explicaciones, vi la diferencia. El lenguaje funcional como Kotlin es realmente desafiante para un desarrollador junior con mentalidad en Java como yo.
Respuesta corta: also
se introdujo por razones semánticas.
Respuesta larga:
Si usas apply
siempre refieres al receptor con this
.
val person = Person().apply {
name = "Tony Stark" // this. can be omitted
age = 52 // this. can be omitted
// ...
}
De esta manera no tiene que repetir la persona varias veces como se muestra aquí:
person.name = "Tony Stark"
person.age = 52
Si el bloque se alarga, le recomendamos que le this
un nombre. Por eso also
se introdujo. Ahora puede referirse al receptor por it
o por un nombre explícito. Esto es especialmente útil si desea usar otro nombre que no sea (en este caso, person
) antes:
val person = Person().also { newPerson ->
newPerson.name = "Tony Stark"
newPerson.age = 52
// ...
}
Por lo tanto, dependiendo de qué tan bien su código debe ser legible, siempre puede usar uno u otro.