Methods 无法更新Kotlin方法参数';s值

Methods 无法更新Kotlin方法参数';s值,methods,compiler-errors,kotlin,immutability,Methods,Compiler Errors,Kotlin,Immutability,我一直遵循科特林的方法 fun getpower(base:Int,power:Int):Int { var result = 1 while(power > 0){ result = result * base power-- // <---- error in this line } return result } fun-getpower(base:Int,power:Int):Int { var结果=1 而(功

我一直遵循科特林的方法

fun getpower(base:Int,power:Int):Int
{
    var result = 1
    while(power > 0){
        result = result * base
        power-- // <---- error in this line
    }
    return result
}
fun-getpower(base:Int,power:Int):Int
{
var结果=1
而(功率>0){
结果=结果*基础

power--//在Kotlin中,方法参数是val(不可变)类型不是var(可变)类型。类似于java
final

这就是为什么我不能变异(改变)它。

在Kotlin中,方法参数是val(不可变)类型不是var(可变)类型。类似于java
final

这就是为什么我不能变异(改变)。

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


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

函数中的函数参数是只读的(就像使用
val
创建的变量),因此不能重新分配它们


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

您看到的错误更多地与作用域有关。函数的设计参数是不可变的或更准确地说是只读的,这就是
val
关键字所代表的,这就是您看到该错误的原因。

您看到的错误与作用域有关。函数的段落meter by design是不可变的,或者更准确地说是只读的,这就是
val
关键字所代表的含义,这就是为什么您会看到这个错误

更新变量有什么问题

其他人的回答是“因为Kotlin函数参数是不可变的。”当然,这是正确的答案

但是考虑到包括Java在内的许多语言都允许您重新分配函数参数,可以将您的问题解释为“Kotlin为什么不允许重新分配函数参数?”

我的答案:Kotlin和Swift有许多共同的功能,所以我去了Swift 3看看为什么他们决定反对函数参数重新分配,并发现了这一点

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

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

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

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

•功能参数不是可反驳的模式,如if-、while-、guard-、for in-和case语句

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

OPs示例代码显示了一个有效的示例,说明了参数重新分配是明确和自然的。必须在一个非常短的函数中再添加一行(以获得一个局部变量来执行参数变量可以执行的操作)IMHO降低了清晰度。同样,IMHO,我希望能够选择性地将我的参数声明为
var

更新变量有什么问题

其他人的回答是“因为Kotlin函数参数是不可变的。”当然,这是正确的答案

但是考虑到包括Java在内的许多语言都允许您重新分配函数参数,可以将您的问题解释为“Kotlin为什么不允许重新分配函数参数?”

我的答案:Kotlin和Swift有许多共同的功能,所以我去了Swift 3看看为什么他们决定反对函数参数重新分配,并发现了这一点

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

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

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

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

•功能参数不是可反驳的模式,如if-、while-、guard-、for in-和case语句

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

OPs示例代码显示了一个有效的示例,说明了参数重新分配是明确和自然的。必须在一个非常短的函数中再添加一行(以获得一个局部变量来执行参数变量可以执行的操作)IMHO降低了清晰度。同样,IMHO,我更希望能够选择性地将我的参数声明为
var

是的,您可以认为它在Java中是有效的final。是的,您可以认为它在Java中是有效的final。