一、区分内置函数apply、also、run、let、with
1、从返回值角度区分:
apply、also返回值是对象
run、let返回最后一行代码的结果值,指定的return 返回值
2、从内置函数内内使用的对象名称
apply、run、with使用this
also、let使用it
使用this可以在内置函数内省略不写直接调用对象的公有成员变量,it必须填上不可省略不写
3、测试kotlin内置函数代码
下面kotlin写了一个学生类,用于实验内置函数效果。
class Student(var name:String? = null, var age:Int = 12)
{
override fun toString(): String {
return "name: $name, age: $age"
}
}
fun main(args: Array<String>) {
//fun <T, R> T.let(f: (T) -> R): R = f(this)
//let :返回最后一行代码的结果值/或者指定的return 返回值,对象操作名称it
println("let内置函数:")
var ret1 = Student().let {
it.name = "你好"
it.age = 22
it
}
println(ret1)
//run :返回最后一行代码的结果值/或者指定的return 返回值,对象操作名称this
//fun <T, R> T.run(f: T.() -> R): R = f()
println("run内置函数:")
var ret3 = Student().run {
name = "99"
this
}
ret3.run {
name = "100"
}
println(ret3)
//apply :返回对象自身,对象操作名称this
println("apply内置函数:")
var ret2 = Student().apply {
name = "小明"
age = 22
}
println(ret2)
//also :返回对象自身,对象操作名称it
ret2 = ret2.also {
it.name = "565"
println(it)
}.also {
it.age = 33
println(it)
}
//最后返回值
println(ret2)
//with的好处在于可以省略,this
with(ret2){
println("$name + $age")
}
}
二、应用场合
1、with
为了省略不写this
//不省略前
with(ret2){
println("${this.name} + ${this.age}")
}
//省略后
//with的好处在于可以省略,this省略后
with(ret2){
println("$name + $age")
}
看!!我弄个println打印都要多加个字节!!!效果一样的。。。当然省略不写的好
2、apply、also、run、let
希望是对象自身是返回值,还是其他类型的返回值?
还是希望省略得不写内置对象名称是this,还是不省略的it呢?