无法更新Kotlin方法参数的值

时间:2017-07-24 12:10:33

标签: methods compiler-errors kotlin immutability

我遵循Kotlin方法

fun getpower(base:Int,power:Int):Int
{
    var result = 1
    while(power > 0){
        result = result * base
        power-- // <---- error in this line
    }
    return result
}

Kotlin编译器给出以下错误 Error:(6, 8) Val cannot be reassigned

更新变量有什么问题?

4 个答案:

答案 0 :(得分:2)

函数内部的函数参数是只读的(就像用val创建的变量一样),因此不能重新赋值。

您可以看到有关此设计决策herehere的讨论。

答案 1 :(得分:1)

  

更新变量有什么问题?

其他人通过有效地说&#34;来回答这个问题,因为Kotlin函数参数是不可变的。&#34;当然,这是一个正确的答案。

但考虑到这么多语言,包括Java ,允许你重新分配函数参数,将你的问题解释为&#34可能是有效的;为什么Kotlin不允许重新分配功能参数?&#34;

我的回答:Kotlin和Swift有许多共同点,所以我去了Swift 3,看看为什么他们决定弃用函数参数重新赋值并发现这个motivation

  

在函数参数上使用var注释具有有限的实用性,以与inout混淆为代价优化一行代码,这具有大多数人期望的语义。为了强调这些值是唯一副本并且没有inout的回写语义,我们不应该在这里允许var。

     

总之,推动这一变化的问题是:

     

•var经常与函数参数中的inout混淆。

     

•var经常被混淆,使值类型具有引用语义。

     

•函数参数不是if-,while-,guard-,for-in-和case语句中的可反映模式。

当然,Kotlin没有inout装饰。但作者本可以选择允许valvarval是默认值。然后他们会有与许多其他语言一致的行为。相反,他们选择了清晰的代码。

OPs示例代码显示了参数重新分配何时清晰且自然的有效示例。必须再向一个非常短的函数添加一行(以获得一个局部变量来完成参数变量可能做的事情),恕我直言会降低清晰度。再次,恕我直言,我希望可以选择将我的参数声明为var

答案 2 :(得分:0)

在Kotlin中,方法参数是 val(不可变)类型而不是 var(可变)类型。与java final类似。 这就是为什么我不能变异(改变)那个。

答案 3 :(得分:0)

您看到的错误更多与范围有关。函数的设计参数是不可变的,或者更准确,只读,val关键字代表的就是你看到错误的原因。