gpt4 book ai didi

lambda - Lambda 与 Receiver 的目的是什么?

转载 作者:IT老高 更新时间:2023-10-28 13:33:35 26 4
gpt4 key购买 nike

Lambda 在 Kotlin 中使用 Receiver 的目的是什么,而我们有扩展函数?

下面的两个函数做同样的事情,但是第一个更易读且简短:

fun main(args: Array<String>) {
println("123".represents(123))
println(123.represents("123"))
}

fun String.represents(another: Int) = toIntOrNull() == another

val represents: Int.(String) -> Boolean = {this == it.toIntOrNull()}

最佳答案

带有接收器的 Lambda 基本上与扩展函数完全相同,它们只是能够存储在属性中,并传递给函数。这个问题本质上与“当我们有函数时,lambdas 的目的是什么?”。答案也大致相同 - 它允许您在代码中的任何位置快速创建匿名扩展函数。

这方面有很多很好的用例(特别是参见 DSLs),但我将在此举一个简单的例子。

例如,假设您有这样一个函数:

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

调用此函数如下所示:

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

此语言功能启用了一些有趣的东西:

  • 在传递给 buildString 的 lambda 中,您处于一个新的范围内,因此有新的方法和属性可供使用。在这种特定情况下,您可以使用 StringBuilder 类型的方法,而无需在任何实例上调用它们。
  • 将进行这些函数调用的实际 StringBuilder 实例并非由您管理 - 由函数的内部实现来创建一个并在其上调用您的扩展函数。
  • 因此,这个函数还可以做更多的事情,而不仅仅是在一个 StringBuilder 上调用一次传递给它的 lambda - 它可以在各种 上多次调用它StringBuilder 实例,存储以备后用等

关于lambda - Lambda 与 Receiver 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329716/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com