Este es un ejemplo de la documentación de propiedades delegadas .
import kotlin.reflect.KProperty class Delegate { operator fun getValue(thisRef: Any?, property: KProperty<*>): String { return "$thisRef, thank you for delegating '${property.name}' to me!" } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { println("$value has been assigned to '${property.name}' in $thisRef.") } }Esto se debe a que las propiedades delegadas se definen por convención . Lo que esto significa es:
[su] semántica se define a través de la expansión sintáctica de una forma de sintaxis en otra forma de sintaxis.
Puede ver la expansión de una propiedad delegada más abajo en la página de documentación :
class C { var prop: Type by MyDelegate() } // this code is generated by the compiler instead: class C { private val prop$delegate = MyDelegate() var prop: Type get() = prop$delegate.getValue(this, this::prop) set(value: Type) = prop$delegate.setValue(this, this::prop, value) }Y una de las características de una sintaxis que se define por convención, es que (del primer enlace):
Todas las expresiones de llamada producidas por expansión solo pueden usar funciones de operador.
y también:
Esta expansión de una forma de sintaxis particular a una pieza diferente de código generalmente se define en términos de funciones de operador.
Solo para darle más ejemplos, el primer enlace muestra más ejemplos de sintaxis definidas por convención. Aquí están las funciones de operador correspondientes relacionadas con ellos:
| Sintaxis definida por convención | Funciones de operador relacionadas |
|---|---|
| Operadores aritméticos y de comparación | plus , compareTo , etc. |
invoke convención | invoke |
| Asignaciones de formulario de operador | plusAssign , minusAssign etc. |
| Declaraciones de bucle for | iterator , hasNext , next |
| Propiedades delegadas | getValue , setValue |
| Destrucción de declaraciones | component1 , component2 , etc. |
Tenga en cuenta que debe colocar la palabra operator en todas esas funciones para que funcione la sintaxis correspondiente. En otras palabras, " operator " significa que esta función puede usarse en una sintaxis definida por convención.
No estoy seguro de entender su pregunta correctamente, pero agregamos un operator para marcar funciones no solo como funciones regulares, sino como funciones designadas para proporcionar alguna funcionalidad específica. Esto no se limita realmente a las propiedades delegadas, es lo mismo para todos los operadores.
Creo que marcar como operadores tiene al menos dos beneficios. Primero, es explícito para el lector que la función se puede usar con alguna característica del lenguaje. En segundo lugar, ayuda a evitar situaciones en las que teníamos la intención de proporcionar algún operador, pero cometimos un error, por ejemplo, en los tipos de parámetros, por lo que se ignora en silencio. El operator nos dice inmediatamente si la firma de la función es correcta o no.