我正在完成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)
}
}
实际上,我从未真正看到过这种语法的任何函数,其中在类构造函数和以下函数之间没有符号。
答案 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