¿Cómo funcionan las funciones de extensión de Kotlin?
Digamos que quiero un número integer que proporcione un método square
.
Kotlin :
- Usar varios lenguajes JVM en el mismo proyecto
- Genéricos reificados en Scala 2.10
- ¿Cómo hacer que los constructores seguros de Kotlin trabajen en Scala?
- Companion se beneficia de la posibilidad de implementar interfaces
- Progtwigción funcional: cómo continuar el context para una cadena de reglas de validation
fun Int.square() = this * this
uso:
println("${20.square()}")
doc:
Las extensiones en realidad no modifican las classs que extienden. Al definir una extensión, no inserta nuevos miembros en una class, sino que simplemente hace que nuevas funciones se puedan llamar con la notación de puntos en variables de este tipo.
Nos gustaría enfatizar que las funciones de extensión se envían estáticamente
Mi expectativa habría sido que simplemente lo agreguen a las funciones miembro de la class extendida durante la compilation, pero eso es lo que niegan explícitamente, así que mi siguiente pensamiento fue que podría ser "algo así" como las implicaciones de scala.
Scala :
object IntExtensions{ implicit Class SquareableInt(i:Int){ def square = i*i } }
uso:
import IntExtensions._
y entonces
println(f"${20.square}")
doc:
Una class implícita se desaparece en una class y un emparejamiento de método implícito, donde el método implícito imita al constructor de la class.
El método implícito generado tendrá el mismo nombre que la class implícita.
Pero Scala implicits crea una nueva class, que inhabilitaría el uso de this
.
Entonces … ¿cómo es que Kotlin extiende las classs? "Hacer llamable" no me dice mucho.
- Tipo de function con receptor en Scala
- Sistema local de administración de packages Java en Python PIP style?
- Scala require () equivalente en Kotlin
- Convierta la function de Scala a la function de Kotlin
- ¿Por qué Kotlin comstack más rápido que Scala?
- ¿Es posible express kotlin 'con' método equivalente en Scala?
- Herencia genérica de Kotlin
- Kotlin zipToda alternativa
En su caso, Kotlin simplemente crea classs simples utilitarias con el nombre " nombre de file" Kt y el método estático " int square (int x) " (java pseudo-código)
Desde Java se ve algo como esto
// filename int-utils.kt final class IntUtilsKt { public static int square(int x) { return x * x; } }
Y después de esto todas las llamadas a
val result = 20.square ()
se transformará (en el nivel de código de bytes) para
val result = IntUtilsKt.square (20);
PD Puedes verlo tú mismo usando la acción de IDEA "Mostrar código de byte Kotlin"
- ¿Por qué el código de byte de Kotlin hace reference a java.util.function.BiConsumer?
- ¿Insertar o agregar un elemento en ArrayList en Kotlin?