2017-07-24 46 views
1

我下面科特林方法无法更新科特林方法参数的值

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

科特林编译器会发出以下错误 Error:(6, 8) Val cannot be reassigned

有什么不对更新变量?

回答

0

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

+1

是的,你可以认为它在Java中是** effective-final **。 –

2

函数内部的函数参数是只读的(如使用val创建的变量),因此它们不能被重新分配。

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

0

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

1

更新变量有什么问题?

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

但鉴于如此多的语言,包括Java,让您重新分配函数的参数,因为它可能是有效的解释你的问题:“为什么科特林不允许重新分配功能的参数?”

我的回答:科特林和斯威夫特有许多共同的特点,让我去斯威夫特3明白为什么他们决定弃用功能参数重新分配,发现这motivation

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

总之,这促使这一变化的问题是:

•VAR通常与函数参数INOUT困惑。

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

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

当然,Kotlin没有inout装饰。但作家可以选择允许valvar,其中val是默认设置。然后他们会有许多其他语言的行为。相反,他们选择了代码清晰度。

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