Lambda与Receiver的目的是什么?

Lambda在Kotlin的接收器的目的是什么?我们有扩展function吗?

下面的两个函数做同样的事情,但是第一个函数更具可读性和简短性:

fun main(args: Array) { println("123".represents(123)) println(123.represents("123")) } fun String.represents(another: Int) = toIntOrNull() == another val represents: Int.(String) -> Boolean = {this == it.toIntOrNull()} 

与接收器的Lambdas基本上和扩展函数完全一样,它们只能存储在属性中,并传递给函数。 这个问题与“我们有function的lambda的目的是什么”基本相同。 答案也非常相似 – 它允许您在代码中的任何位置快速创建匿名扩展函数。

这里有许多很好的用例(尤其是DSL ),但我会在这里举一个简单的例子。

例如,假设您有这样的function:

 fun buildString(actions: StringBuilder.() -> Unit): String { val builder = StringBuilder() builder.actions() return builder.build() } 

调用这个函数看起来像这样:

 val str = buildString { append("Hello") append(" ") append("world") } 

有一些有趣的事情可以实现:

  • 在传递给buildString的lambdaexpression式中,您处于一个新的范围内,您可以使用新的方法和属性。 在这个特定的情况下,你可以使用StringBuildertypes的方法,而不必在任何实例上调用它们。
  • 实际的StringBuilder实例这些函数调用将不会由您来管理 – 直到创建一个函数的内部实现,并调用您的扩展函数。
  • 从前面的观点来看,这个函数可以做的不仅仅是调用你传递给它的函数 – 它可以在不同的StringBuilder实例上多次调用它,存储它以备后用。