运算符重载功能不在括号{}中

时间:2019-03-04 21:01:37

标签: kotlin

我正在完成Kotlin Koans Operators Overloading练习,答案包括一个这样的课程:

class RepeatedTimeInterval(val timeInterval: TimeInterval, val number: Int)
operator fun TimeInterval.times(number: Int) = RepeatedTimeInterval(this, number)

我有点困惑为什么operator函数不在大括号{}中。

在我见过的所有教程(example)中,运算符始终位于花括号内:

class Point(val x: Int = 0, val y: Int = 10) {

    // overloading plus function
    operator fun plus(p: Point) : Point {
        return Point(x + p.x, y + p.y)
    }
}

实际上,我从未真正看到过这种语法的任何函数,其中在类构造函数和以下函数之间没有符号。

2 个答案:

答案 0 :(得分:2)

您看到的函数没有类方法;它不在类中定义,也不构成类的一部分。 (甚至可以在另一个文件或另一个包中完全定义它。)

相反,它是extension function:一个独立的函数,它不属于类,但在某些方面的行为就像是。

您可以知道,因为函数名称中包含.。这告诉编译器函数正在{em>扩展扩展.之前的类。

如果扩展功能在范围内,则可以使用与调用方法相同的语法来调用它;在函数中,this引用了该类的一个实例(“接收者”)。但是,您不能访问该类的私有方法或属性。 this如果要扩展可为空的类型,则可以为null;并且该函数是静态解析的(在编译时,如函数调用;而不在运行时,如方法调用)。

这是Kotlin的重要功能之一,因此值得一读。

答案 1 :(得分:2)

在第一个示例中,您通过提供Extension Function重载了运算符。在Kotlin中,您似乎可以将函数添加到任何现有类中。在后台,这就像Java中的静态方法一样。

这两个示例都在Point类上重载plus运算符:

class Point(val x: Int = 0, val y: Int = 10) {

    operator fun plus(p: Point) : Point {
        return Point(x + p.x, y + p.y)
    }
}

或使用扩展功能:

class Point(val x: Int = 0, val y: Int = 10)
operator fun Point.plus(p: Point) : Point {
    return Point(x + p.x, y + p.y)
}

当您调用它们时,它们看起来相同:

val p = Point(1, 2)
val x = p + p // x = 2, 4