1. let的返回类型是根据匿名函数的变化而变化(lambda的返回类型变化而变化)
2. 匿名函数里面持有的是 it == I == info本身
inline fun <I, O> I.let(lambda:(I) -> O) = lambda(this)
1. apply的返回类型永远都是I(所以可以链式调用), lambda的返回类型无变化即Unit,并且没有和lambda关联返回类型
2. I.()匿名扩展函数里面持有的是 this == I == info本身
inline fun <I> I.apply(lambda:I.() -> Unit):I{
lambda()
return this
}
inline fun <R> run(block: () -> R): R {
return block()
}
//inline fun <R> run(block: () -> R): R = block()
inline fun <T, R> T.run(block: T.() -> R): R {
return block()
}
//inline fun <T, R> T.run(block: T.() -> R): R = block()
inline fun <T, R> with(receiver: T, block: T.() -> R): R {
return receiver.block()
}
//inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
inline fun <T> T.apply(block: T.() -> Unit): T {
block()
return this
}
inline fun <T> T.also(block: (T) -> Unit): T {
block(this)
return this
}
public inline fun <T, R> T.let(block: (T) -> R): R {
return block(this)
}
//inline fun <T, R> T.let(block: (T) -> R): R = block(this)
inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? {
return if (predicate(this)) this else null
}
//inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null
inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? {
return if (!predicate(this)) this else null
}
//inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null
//inline 高阶函数使用内联对lambda进行优化处理提高性能
//fun <INPUT> 函数中声明一个泛型
//INPUT.mApply 让所有的类型都可以调用mApply扩展函数
//INPUT.() -> Unit 让我们的匿名扩展函数里面持有this
//在lambda里面不需要返回值,里面永远都是返回INPUT本身
private inline fun <INPUT> INPUT.mApply(lambda: INPUT.() -> Unit): INPUT {
lambda()//this可以省略
return this
}
/**
* public inline fun <T> T.apply(block: T.() -> Unit): T {
* block()
* return this
* }
*/
fun main() {
val r: File = File("D:\\a.txt")
.mApply {
//输入的是 this == File对象本身
this.setReadable(true)
setWritable(true)
println("1 ${readLines()}")
}.mApply {
//输入的是 this == File对象本身
setReadable(true)
setWritable(true)
println("2 ${readLines()}")
}
}