首页 > 解决方案 > Kotlin 中的 `also` 如何返回旧值?

问题描述

Kotlin 中如何also返回旧值以及赋值?

你能解释一下这个 Kotlin 代码是如何工作的(最好是一步一步地)并打印 1 和 2 吗?

另外,据我所知,在 Kotlin 中,函数无法重新分配值,为什么它不会引发错误?

fun <T> T.myAlso(block: (T) -> Unit): T {
    block(this)
    return this
}

fun main() {
    var a = 1
    println(a.myAlso { a = 2 })
    println(a)
}

谢谢

标签: kotlinfunctional-programming

解决方案


您的myAlso()功能是具有接收器的功能。所以它实际上有两个参数:接收者(一个T值)和一个代码块。在函数体内,接收者被调用this

您的函数调用代码块,传递接收器值;然后它返回相同的接收器值。

另请注意ais var,因此可以重新分配它。(如果它是 ,它将是只读的。语言文档val中描述了这种基本语法。)

所以,让我们一步一步来解释会发生什么……</p>

在 内main()a最初设置为 1。

棘手的一点是a.myAlso { a = 2 }表达式。调用myAlso(),将 的值a作为接收者(即 1)和代码块传递。它调用代码块,传递接收器值 1;该块忽略了这一点,而是分配a了值 2。但是,这并没有改变函数的接收器,它仍然是 1;这就是它返回的内容,因此也是第一个 println()打印的内容。

当然,现在a是 2,所以这就是第二个println()打印的内容。


推荐阅读