final或val函数参数还是在Kotlin中?

LEM*_*ANE 21 kotlin

为什么Kotlin删除了在Java中非常有用的final或val函数参数?

fun say(val msg: String = "Hello World") {
    msg = "Hello To Me" // would give an error here since msg is val    
                        //or final
    ...
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 40

Kotlin函数参数是最终的.没有val或final关键字,因为这是默认值(并且无法更改).

  • 相关的3年讨论:https://discuss.kotlinlang.org/t/function-parameters-are-val-not-var/897 (2认同)

Rah*_*hul 7

之后科特林M5.1支持可变参数的去除,在早期版本可以使用实现

fun foo(var x: Int) {
  x = 5
}
Run Code Online (Sandbox Code Playgroud)

根据 Kotlin 开发人员的说法,删除此功能的主要原因如下 -

  1. 主要原因是这令人困惑:人们倾向于认为这意味着通过引用传递参数,我们不支持(在运行时成本很高)。

  2. 另一个混淆的来源是主构造函数:构造函数声明中的“val”或“var”意味着与函数声明(即,它创建一个属性)的同一事物不同的东西。

  3. 另外,我们都知道变异参数不是一个好的风格,所以在函数中的参数前面写“val”或“var”,for循环的catch块不再被允许。

摘要-val现在所有参数值。您必须引入单独的变量来重新初始化。例子 -

fun say(val msg: String) {
    var tempMsg = msg
    if(yourConditionSatisfy) {
       tempMsg = "Hello To Me"
    }
}
Run Code Online (Sandbox Code Playgroud)