【问题标题】:Unable to update Kotlin method parameter's value [duplicate]无法更新 Kotlin 方法参数的值 [重复]
【发布时间】:2017-12-30 00:34:41
【问题描述】:
我一直在关注 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
更新变量有什么问题?
【问题讨论】:
标签:
methods
compiler-errors
kotlin
immutability
【解决方案1】:
函数内部的函数参数是只读的(就像使用val 创建的变量一样),因此它们不能被重新分配。
您可以在here 和here 看到有关此设计决策的讨论。
【解决方案2】:
更新变量有什么问题?
其他人通过有效地说“因为 Kotlin 函数参数是不可变的”来回答这个问题。当然,这是一个正确的答案。
但鉴于有这么多语言,包括 Java,允许您重新分配函数参数,将您的问题解释为“为什么 Kotlin 不允许重新分配函数参数? "
我的回答:Kotlin 和 Swift 有很多共同点,所以我去 Swift 3 看看为什么他们决定弃用函数参数重新分配并发现这个motivation.
在函数参数上使用 var 注释的效用有限,优化一行代码的代价是与大多数人期望的语义 inout 混淆。为了强调这些值是唯一副本并且没有 inout 的回写语义这一事实,我们不应在此处允许 var。
总之,促成这种变化的问题是:
• var 经常与函数参数中的 inout 混淆。
• var 经常被混淆以使值类型具有引用语义。
•函数参数是不可反驳的模式,例如 if-、while-、guard-、for-in- 和 case 语句。
当然,Kotlin 没有 inout 装饰。但是作者可以选择允许val 和var,val 是默认值。那么他们的行为就会与许多其他语言一致。相反,他们选择了代码清晰。
OP 示例代码显示了参数重新分配何时清晰自然的有效示例。必须在一个非常短的函数中再添加一行(以获取局部变量来执行参数变量可以完成的操作)恕我直言,这会降低清晰度。再说一次,恕我直言,我更愿意选择能够将我的参数声明为var。
【解决方案3】:
在 Kotlin 中,方法参数是 val(non-mutable) 类型而不是 var(mutable) 类型。类似于 java final。
这就是为什么我不能改变(改变)那个。
【解决方案4】:
您看到的错误更多地与范围界定有关。函数的参数在设计上是不可变的或更准确地说是只读的,这就是 val 关键字所代表的意思,这就是您看到该错误的原因。