kotlin - 在 kotlin 中通过引用传递值
问题描述
我想将一个值传递给一个函数,所以当我在该函数之外更改值时,我也可以在我的函数中看到它的更新。我知道当我传递 Int、Boolean 等盒装类型时,它们按值传递。但看起来类也是按值传递的:
data class TestClass(var b:Boolean)
fun printBooleanIn1sec(b: TestClass) {
Thread.sleep(1000L)
println(b.b)
}
fun main(args: Array<String>) {
var testClass = TestClass(false)
printBooleanIn1sec(testClass)
testClass.b = true
}
// prints "false"
如果我需要的话,有没有办法在 Kotlin 中通过引用而不是通过值传递一些东西?
解决方案
类实例总是按引用的值传递。因此,函数中使用的引用指向与传递给它的引用相同的东西,但您永远无法直接访问 Kotlin/Java 中的指针。做出这种区分很重要,因为“按引用传递”意味着如果堆栈上的较高代码更改了其变量指向的内容,则该函数最终可能会查看不同的对象。
您的代码打印错误的原因是您正在睡觉的线程与调用您的函数的线程相同,并且在到达printBooleanIn1sec()
之前返回。testClass.b = true
为了说明您想要的情况,您需要启动一个休眠然后打印值的新线程,例如:
fun printBooleanIn1sec(b: TestClass) {
thread {
Thread.sleep(1000L)
println(b.b)
}
}
原语在 Kotlin 中被抽象出来,因此您不必以与类不同的方式来看待它们。但是像任何其他不可变类一样,当您将它们传递给函数时,您根本无法更改它们的值。如果您想“看到”函数中发生在其他地方的更改,则必须将它们包装在var
为它们保存属性的类中。