Diferencia entre el receptor de function y la function de extensión

Estaba leyendo sobre Kotlin y no entendí bien la idea

de Lo que entendí la function de extensión le da capacidad a una class con nueva funcionalidad sin tener que henetworkingar de la class

y qué es el receptor igual, excepto que se puede asignar a variable

¿Hay algo más al respecto?

¿Alguien puede dar algunos ejemplos?

Funciones de extensión:

Al igual que Swift y C #, Kotlin proporciona la capacidad de extender una class con nuevas funcionalidades sin tener que modificar la class o henetworkingar de la class.

¿Te preguntas por qué? Porque no podemos editar ni agregar funciones al lenguaje ni a las classs de SDK. Así que terminamos creando classs de Util en Java. Creo que todos los proyectos tienen un grupo de classs * Utils para poner los methods de ayuda que se usan en varios lugares en la base de códigos. Las funciones de extensiones ayudan a solucionar este problema de Util.

¿Cómo escribimos un método de ayuda en Java para encontrar si el valor largo dado se refiere a hoy?

public class DateUtils { public static boolean isToday(long when) { // logic ... } } 

Y llamamos a ese método pasando el valor largo como argumento:

 void someFunc(long when) { boolean isToday = DateUtils.isToday(when); } 

En Kotlin, podemos extender la class Long para include la function isToday () en ella. Y podemos llamar a la function isToday () en el valor Long mismo como cualquier otra function miembro en la class.

 // Extension function fun Long.isToday(): Boolean { // logic ... } fun someFunc(time: Long) { val isToday = time.isToday() } 

Comparado con los methods Util, Kotlin proporciona una syntax mucho más rica usando las funciones de Extensión.

Esto mejora la legibilidad del código, lo que a su vez mejora su capacidad de mantenimiento. Y obtenemos un poco de ayuda de la finalización del código del IDE. Así que no tenemos que recordar qué class de Util utilizar para la function deseada.

Bajo el capó, el comstackdor de Kotlin genera los methods estáticos de ayuda como si los hubiéramos escrito como methods Java estáticos. Así que obtenemos esta syntax agradable y rica en Kotlin sin sacrificar ninguna actuación.

Similar a las funciones, Kotlin también admite properties de extensión donde podemos agregar una propiedad a una class existente.

Funciones de order superior:

Una function de order superior es una function que toma funciones como parameters o devuelve una function.

Veamos cómo se escribe una function de order superior.

 fun execute(x: Int, y: Int, op: (Int, Int) -> Int): Int { return op(x, y) } 

Aquí el tercer parámetro (op) es una function y hace que esta function sea una function de order superior. El tipo del parámetro op es una function que toma 2 Ints como parámetro y devuelve un Int.

Para invocar esta function de order superior, podemos pasar una function o una expresión lambda:

 execute(5, 5) { a, b -> a + b } 

Receptor (o literal de function con Receiver o Lambda con Recevier):

Una function de order superior que toma una function de extensión como su parámetro se llama Lambda con Receptor.

Veamos la implementación de la function aplicar que está disponible en la biblioteca estándar de Kotlin.

 inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this } 

La function que pasamos a esta function de aplicación es en realidad una function de extensión al tipo T. Entonces, en la function lambda, podemos acceder a las properties y funciones del tipo T, como si estuviéramos escribiendo esta function dentro de la propia class T.

Aquí el tipo genérico T es el receptor y estamos aprobando una function lambda, de ahí el nombre Lambda con Receiver.

Otro ejemplo:

 inline fun SQLiteDatabase.inTransaction(func: SQLiteDatabase.() -> Unit) { beginTransaction() try { func() setTransactionSuccessful() } finally { endTransaction() } } 

Aquí, el inTransaction () es una function de extensión para la class SQLiteDatabase y el parámetro de la function inTransaction () también es una function de extensión para la class SQLiteDatabase. Aquí, SQLiteDatabase es el receptor, para la lambda que se pasa como argumento.

Para invocar esa function:

 db.inTransaction { delete( ... ) } 

Aquí el delete () es la function de la class SQLiteDatabase y dado que el lambda que pasamos es una function Extension para el receptor SQLiteDatabase , podemos acceder a la function delete sin ningún calificador adicional, como si estuviéramos llamando a la function desde el SQLiteDatabase class en sí.

  • <fragment> label equivalente en anko DSL
  • Kotlin: ¿Hay alguna manera de limpiar las sobrecargas de numbers?
  • ¿Por qué ReversedLinesFileReader es tan lento?
  • La aplicación se bloquea al generar la stack de nuevo
  • NoClassDefFoundError en time de ejecución
  • Kotlin Annotation processor + AutoService
  • Complemento de IntellJ IDEA Kotlin: "no hay configuradores disponibles"
  • Definición de class no encontrada en el código de Kotlin
  • Advertencia y abandono de Kotlin / Quasar Fiber
  • Formulario de inicio de session con request de repetición en rxJava y Retrofit
  • Configuración regional del cambio de idioma en la progtwigción "Kotlin" Como la configuration regional funciona en Java Fine, pero en el idioma Kotlin no funciona