kotlin 函数如何实现引用传递


#1

kotlin 的函数参数默认是 val 类型,如果想在函数内操作完成后直接将该参数置为 null,如何实现,谢谢。

fun search(root: BinaryTreeNode?) :Int {
    // 具体逻辑
    root = null // 此处报错
}

#2

Kotlin 最开始支持参数 指定 var 类型, 后面删除了该支持, 具体原因参照:

see: https://blog.jetbrains.com/kotlin/2013/02/kotlin-m5-1/


#3

多谢指点。那这样的话,我就只能在函数执行完成后,在函数外将该参数置为 null。我觉得这样设计可能是为了避免在函数内操作出现后续 bug。:+1:


#4


那对于这种迭代的传值方式,恰好参数的改变是在最后,并且没有再次迭代(把改变后的值传回参数),这个怎么操作。
:pray:


#5

val 和 var 其实修改的只是参数而已,跟外部你传进来的引用又有什么关系呢。这个置为 null 的操作本身就是多余的,参数作为函数栈帧上面的变量,会在函数退出后回收。

所以,就算 Kotlin 像 Java 那样支持你修改参数,也不能达到你的目的。


#6

要么传一个对象进来,修改它的成员,要么作为返回值返回。修改引用本身和修改值一样对于函数作用域外没有意义。


#7

明白了,谢谢指点。


#8

我个人觉得这样设计目的是为了强调函数式编程的"没有副作用"
毕竟按你的思路,你在函数内部将传入的参数置空了,调用者应该会觉得很奇怪。
给参数的属性添加一个标志值,在递归时去判断该值是否满足条件,以代替root == null,这样我认为更方便理解吧 :grin:


#9

受教了,:+1:


京ICP备16022265号-2 Kotlin China 2017 - 2018
本站由腾讯云提供计算服务