Venkat在他的书《 Kotlin中的编程》(第237页)中解释了流畅方法Also(),apply(),let()和run()之间的区别
但是列出的代码无法编译。
特别是这两个调用:编译器说"'this' is not defined in this context"
val result1 = str.let { arg ->
print(String.format(format, "let", arg, this, result))
result
}
println(String.format("%-10s", result1))
val result2 = str.also { arg ->
print(String.format(format, "also", arg, this, result))
result
}
println(String.format("%-10s", result2))
所以我的问题是:let()和Also()是否支持'this'关键字。
答案 0 :(得分:4)
如果您查看let
的源函数:
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
您将看到它带有一个参数的lambda。因此,要使用该参数,可以使用it
。
如果在let
中调用this
,它将引用调用该函数的类的范围:
class Clazz {
fun function() {
something.let {
// `this` refers to class scope, so `this` is a Clazz
// `it` refers to the something itself
}
}
}
与also
相同。
also
和let
之间的区别在于它们的返回方式。 let
返回块返回的内容,also
将返回对象本身,并且let
使用lambda作为参数,因此可以使用it
访问该参数,而{ {1}}使用 lambda接收器,该参数使参数可作为also
访问。
TL; DR
在this
中,关键字let
将引用它所属的类。因此,如果它不在课程中,那么它什么也不会引用。