2

这是Delegated properties文档中的一个示例。

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.")
    }
}
4

2 回答 2

3

这是因为委托属性是按约定定义的。这意味着:

[它的]语义是通过将一种句法形式句法扩展为另一种句法形式来定义的。

您可以在文档页面的下方看到委托属性的扩展:

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)
}

约定定义的语法的一个特征是(来自第一个链接):

All call expressions that are produced by expansion are only allowed to use operator functions.

and also:

This expansion of a particular syntax form to a different piece of code is usually defined in the terms of operator functions.

Just to give you more examples, the first link shows more examples of syntaxes that are defined by convention. Here are the corresponding operator functions related to them:

Syntax defined by convention Related operator functions
Arithmetic and comparison operators plus, compareTo etc
invoke convention invoke
Operator-form assignments plusAssign, minusAssign etc
For-loop statements iterator, hasNext, next
Delegated properties setValue, getValue
Destructuring declarations component1, component2 etc

Notice that you need to put the word operator on all of those functions for the corresponding syntax to work. In other words, "operator" signifies that this function can be used in a syntax defined by convention.

于 2021-10-29T12:40:22.967 回答
1

我不确定我是否正确理解了您的问题,但我们添加operator了将功能标记为不仅是常规功能,而且是指定用于提供某些特定功能的功能。这并不仅限于委托属性 - 所有运算符都相同。

我认为标记为运营商至少有两个好处。首先,读者很清楚该函数可以与某些语言特性一起使用。其次,它有助于避免我们打算提供一些运算符的情况,但是我们犯了错误,例如参数类型,所以它被默默地忽略了。operator立即告诉我们函数签名是否正确。

于 2021-10-29T12:32:56.680 回答