gpt4 book ai didi

lambda - 对理解 lambda 和接收器感到困惑

转载 作者:IT老高 更新时间:2023-10-28 13:47:17 25 4
gpt4 key购买 nike

Kotlin 版本 1.2.50

我一直在 youtube https://www.youtube.com/watch?v=gPH9XnvpoXE 上关注本教程的一些示例.还有一些事情我已经理解了,但仍然有些困惑。我在下面的代码中留下了我不确定发生了什么的注释。

fun main(args: Array<String>) {

val javaClient = createClient {
firstName = "joe"
lastName = "bloggs"

twitter {
handle = "@joebloggs"
}
}

println(javaClient.toConsole)
}

/* Are we passing in a lambda and receiver. What will the receiver be */
private fun JavaClientBuilder.twitter(suppler: JavaTwitterBuilder.() -> Unit) {
/* We call JavaTwitterBuilder().apply(..) Will apply return the newly created object? Not sure why we have to pass the suppler in the apply */
twitter = JavaTwitterBuilder().apply(suppler).build()
}

/* Are we passing in a lambda and receiver that return nothing */
private fun createClient(suppler: JavaClientBuilder.() -> Unit): JavaClient {
val javaClientBuilder = JavaClientBuilder()

/* confusion: Not sure about this, as we are calling suppler. Just wondering is the suppler the the JavaClientBuilder that was called in the above javaClient {} lambda */
javaClientBuilder.suppler()

return javaClientBuilder.build()
}

/* I understand this, an extension function that formats and returns the string from the JavaClient object it was called on */
private val JavaClient.toConsole: String
get() =
"Created client is: ${twitter.handle} ${company.name}"

最佳答案

/* Are we passing in a lambda and receiver. What will the receiver be */

private fun JavaClientBuilder.twitter(suppler: JavaTwitterBuilder.() -> Unit)

我们在这个函数中确实有一个接收器,它是 JavaClientBuilder 的实例,这个函数将被调用。

/* We call JavaTwitterBuilder().apply(..) Will apply return the newly created object? Not sure why we have to pass the suppler in the apply */

twitter = JavaTwitterBuilder().apply(suppler).build()

要了解 apply() 的工作原理,请查看其源代码(简化版):

public inline fun <T> T.apply(block: T.() -> Unit): T {
block()
return this
}

它是在 T 类型的接收器上声明的扩展函数,并返回 T 的实例,它接收一个 block - 另一个具有 类型的接收器的扩展函数>T 返回单位。它通常用于替换 Builder 模式 - 将自定义初始化逻辑应用于对象。在您的情况下,suppler 是一个包含 JavaTwitterBuilder 实例的初始化逻辑的 block 。函数代码创建实例并使用 apply()suppler 中的逻辑来初始化该实例。

/* Are we passing in a lambda and receiver that return nothing */

private fun createClient(suppler: JavaClientBuilder.() -> Unit): JavaClient

在这种情况下,createClient() 没有接收器,它是一个顶级函数。

/* confusion: Not sure about this, as we are calling suppler. Just wondering is the suppler the the JavaClientBuilder that was called in the above javaClient {} lambda */

javaClientBuilder.suppler()

suppler 是一个 lambda,其中 JavaClientBuilder 是接收器类型,这允许我们在新创建的 JavaClientBuilder 实例上调用它。

/* I understand this, an extension function that formats and returns the string from the JavaClient object it was called on */

private val JavaClient.toConsole: String get() = "Created client is: ${twitter.handle} ${company.name}"

对!只是一个小的修正,它是一个扩展属性。属性可以有自定义的 getter 和 setter。这个属性定义了一个自定义的 getter,所以实际上每当访问这个属性时,它都会产生一个字符串,其格式由 getter 代码描述。

关于lambda - 对理解 lambda 和接收器感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52688510/

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