无法更新Kotlin方法参数的值

我遵循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

更新变量有什么问题?

函数内部的函数参数是只读的(就像使用val创建的变量一样),所以它们不能被重新分配。

你可以在这里和这里看到关于这个设计决定的讨论。

更新变量有什么问题?

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

但是考虑到如此多的语言( 包括Java )允许您重新分配函数参数,因此将您的问题解释为“为什么Kotlin不允许重新分配函数参数?”。

我的答案 :Kotlin和Swift有很多共同点,所以我去了Swift 3,看看为什么他们决定弃用函数参数重新分配,并找到了这个动机 。

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

总而言之,引发这一变化的问题是:

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

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

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

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

OP示例代码显示了参数重新分配何时清晰自然的有效示例。 不得不添加一行到一个很短的函数(获取一个局部变量来完成参数变量可能做的事情),恕我直言,降低了清晰度。 再次,恕我直言,我会首选可以声明我的参数为var

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

您看到的错误与范围界定有关。 一个函数的设计参数是不可变的或更准确的,只读的,这就是val关键字代表的,这就是为什么你看到这个错误。