使用 Kotlin 中的属性(property)也可以实现这一点。
import kotlin.reflect.KMutableProperty0
var num = 1
fun main() {
println(num)
changeNum(::num)
println(num)
}
fun changeNum(numProperty: KMutableProperty0<Int>) {
numProperty.set(12345)
}
>> 1
>> 12345
KMutableProperty0
表示一个基本的 var
,因此您可以使用::num
语法(与传递函数引用的方式相同)传递属性引用。这样,您不是传递当前值,而是向函数提供属性本身的引用,然后您可以在其上调用 set
。
但问题是,你真的想这样做吗?或者你是在过度复杂化一些应该以更简单或更可读的方式完成的事情吗?你实际上不能在fun main()
中像你试图做的那样使用一个变量,只能是对象上的属性(基本上是顶层变量) - 但即使您可以,为什么不使用下面这个方法呢?
fun main() {
var num: Int = 5
...
num = changeNum(num)
}
这仍然是一行代码调用,您的changeNum
函数仍然可能具有副作用,可以进行验证等操作,只是返回结果而不是设置为副作用。这样更容易理解,特别是当它是在对象上设置值的常规方式时。
如果您真的想使用引用(references),但将它们置于类中的顶层很麻烦,那么也许考虑创建一个状态对象:
import kotlin.reflect.KMutableProperty0
data class AllThemNums(var num1 :Int = 1, var num2: Int = 9999)
fun main() {
val nums = AllThemNums(num1 = 5)
changeNum(nums::num1)
println(nums)
}
fun changeNum(numProperty: KMutableProperty0<Int>) {
numProperty.set(numProperty.get() + 2)
}
>> AllThemNums(num1=7, num2=9999)
你甚至可以将changeNum
函数放在数据类内部!
fun changeNum(num: Int): Int
,然后返回你想要的值呢? - Steve.P