studio reales proyectos programacion introducción incluye guia fuente desarrollo código avanzado aplicaciones kotlin

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.