带接收器的lambda基本上与扩展函数完全相同,它们只能存储在属性中,并传递给函数.这个问题本质上等同于"当我们有功能时,lambdas的用途是什么?"答案也大同小异-它允许您在代码中的任何位置快速创建匿名扩展函数.
There are many good use cases for this (see DSLs in particular), but I'll give one simple example here.
For instance, let's say you have a function like this:
fun buildString(actions: StringBuilder.() -> Unit): String {
val builder = StringBuilder()
builder.actions()
return builder.toString()
}
调用此函数如下所示:
val str = buildString {
append("Hello")
append(" ")
append("world")
}
这项语言功能提供了几个有趣的功能:
- Inside the lambda you pass to
buildString
, you're in a new scope and as such have new methods and properties available for use. In this specific case, you can use methods on the StringBuilder
type without having to call them on any instance.
- The actual
StringBuilder
instance these function calls are going to be made on is not managed by you - it's up to the internal implementation of the function to create one and call your extension function on it.
- Consequently, it would also be possible for this function to do much more than just call the lambda you passed to it once on one
StringBuilder
- it could call it multiple times, on various StringBuilder
instances, store it for later use, etc.