kotlin - 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)
}
谢谢
解决方案
您的myAlso()
功能是具有接收器的功能。所以它实际上有两个参数:接收者(一个T
值)和一个代码块。在函数体内,接收者被调用this
。
您的函数调用代码块,传递接收器值;然后它返回相同的接收器值。
另请注意a
is var
,因此可以重新分配它。(如果它是 ,它将是只读的。语言文档val
中描述了这种基本语法。)
所以,让我们一步一步来解释会发生什么……</p>
在 内main()
,a
最初设置为 1。
棘手的一点是a.myAlso { a = 2 }
表达式。调用myAlso()
,将 的值a
作为接收者(即 1)和代码块传递。它调用代码块,传递接收器值 1;该块忽略了这一点,而是分配a
了值 2。但是,这并没有改变函数的接收器,它仍然是 1;这就是它返回的内容,因此也是第一个
println()
打印的内容。
当然,现在a
是 2,所以这就是第二个println()
打印的内容。
推荐阅读
- r - 仅保留仅重复一次的行
- active-directory - 本地用户帐户禁用日期
- ruby-on-rails - RGeo::GeoJSON 不解码并返回几何体 as_text 用于“甜甜圈”多边形
- javascript - Javascript HTML 重定向
- reporting-services - ReportViewer 滚动条在 Internet Explorer 11 上不可见
- python-3.x - TypeError:'dict'和'dict'的实例之间不支持'<'
- swift - 一次循环初始化多个不可变数组
- machine-learning - 对分钟数据执行交叉验证
- java - 无法更改 Java 文件权限
- python - selenium 和 python 的新手,不知道如何从列表中调用一个项目