我遵循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
更新变量有什么问题?
答案 0 :(得分:2)
答案 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
装饰。但作者本可以选择允许val
和var
,val
是默认值。然后他们会有与许多其他语言一致的行为。相反,他们选择了清晰的代码。
OPs示例代码显示了参数重新分配何时清晰且自然的有效示例。必须再向一个非常短的函数添加一行(以获得一个局部变量来完成参数变量可能做的事情),恕我直言会降低清晰度。再次,恕我直言,我希望可以选择将我的参数声明为var
。
答案 2 :(得分:0)
在Kotlin中,方法参数是 val(不可变)类型而不是 var(可变)类型。与java final
类似。
这就是为什么我不能变异(改变)那个。
答案 3 :(得分:0)
您看到的错误更多与范围有关。函数的设计参数是不可变的,或者更准确,只读,val
关键字代表的就是你看到错误的原因。