//给字符串追加若干个感叹号
fun String.addExt(amount:Int = 1) = this + "!".repeat(amount)
//在超类上定义扩展函数,Any的所有子类都能使用该函数
fun Any.easyPrint() = println(this)
class TeBot()
fun main() {
println("abc".addExt(2))
"abc".easyPrint()
val teBot = TeBot()
teBot.easyPrint()
}
新的泛型扩展函数不仅可以支持任何类型的接受者,还保留了接收者的类型信息
//泛型扩展函数
fun <T> T.easyPrint2():T{
println(this)
return this
}
fun main() {
println("abc".addExt(2))
"abc".easyPrint2().addExt(2).easyPrint2()
}
//可空类型扩展函数
//fun String?.printWIthDefault(default:String) = print(this ?: default)
infix fun String?.printWIthDefault(default:String) = print(this ?: default)
fun main() {
val nullableString: String? = "efg"
// nullableString.printWIthDefault("abc")
//加了infix关键字
nullableString printWIthDefault "abc"
}
//增加统计元音字母属性
val String.numVowels
get() = count{
"aeiou".contains(it)
}
fun main() {
"the people's republic of china".numVowels.easyPrint()
}
package extention
//扩展文件
fun <T> Iterable<T>.randomTake(): T = this.shuffled().first()
import extention.randomTake
//重命名扩展
import extention.randomTake as random
//扩展文件
fun main() {
val list = listOf("Jak", "Jim")
val set = setOf("Jak", "Jim")
list.randomTake()
list.random()
}
import java.io.File
//apply函数中的扩展函数
//从T.apply可以看出apply本身是一个扩展函数,并且是泛型扩展函数 返回类型是泛型T
//入参block是一个匿名函数() -> Unit,
// T.() -> Unit表示的是一个扩展函数,在T上扩展了一个匿名函数,
// 之所以要传扩展函数是因为扩展函数内部包括隐式调用,有this
//匿名函数也可以是扩展函数,下面的匿名函数的内部this指向一个File对象
//File.() -> Unit
public inline fun <T> T.apply(block: T.() -> Unit): T {
block()
return this
}
fun main() {
File("xxx").apply {
setWritable(true)
setReadable(true)
}
//分解一下
//1.定义扩展函数
fun File.ext() : Unit {
setReadable(true)
}
//2.给block赋值
val block = File::ext
//3.传入apply函数
File("xxx").apply(block)
}