5.6.1 大有用途的扩展函数
很多高级语言都有扩展函数,但是Java 里面还这就没有扩展函数,但是我们的Kotlin 有啊,接下来我们就直奔主题,什么是扩展函数?其实就是在一个类的外部,我们为这个类定义的函数就是扩展函数,包括源码类。扩展函数命名规则有些不同,扩展函数的名字结构为 被扩展的类.扩展名称 ,举个例子:
fun main() {
"我是".extend()
}
fun String.extend(){
println("$this,扩展函数")
}
这下就很清晰了吧,我把String类扩展了一个extend ,然后直接调用了。这样我们的API 更加的简洁,一下子让我们的带更加的方便了起来。
5.6.2 有趣的运算符重载
在Kotlin 中运算符也是可以重载的,每个运算符其实都是一个内置函数,我们可以重载这个内置函数,让这个运算符可以有更多的功能。
那么如何重载运算符呢?我们可以通过operator 关键字,只要在指定的函数前面加上operator 关键字就可以实现重载的功能了。但是这个指定函数是什么,相信之前写Java 的伙伴们都是一头雾水,没关系这里有表:
语法糖表达式 | 实际调用函数 |
a + b | a.plus(b) |
a - b | a.minus(b) |
a * b | a.times(b) |
a / b | a.div(b) |
a % b | a.rem(b) |
a++ | a.inc() |
a-- | a.dec() |
+a | a.unaryPlus() |
-a | a.unaryMinus() |
!a | a.not() |
a == b | a.equals(b) |
a > b a < b a >= b a <= b | a.compareTo(b) |
a..b | a.rangeTo(b) |
a[b] | a.get(b) |
a[b] = c | a.set(b, c) |
a in b | b.contains(a) |
每个运算符对应的函数都列出来了,有表了不起啊~我们来举个例子吧:
fun main() {
6* "我"
}
operator fun Int.times(str:String){
val builder = StringBuilder()
repeat(this){
builder.append(str)
}
println(builder.toString())
}
成了,注意operator 要写在fun 前面,我们这里重载了Int 类中的 * ,由于是源码类 所以我们不能直接去类的内部重载,就运用到了 扩展函数。如果在一个类的内部写运算符重载的话,那么就不需要去写扩展函数了。