Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parameters 无法为Kotlin中的fun中的局部变量重新分配Val编译时错误_Parameters_Kotlin - Fatal编程技术网

Parameters 无法为Kotlin中的fun中的局部变量重新分配Val编译时错误

Parameters 无法为Kotlin中的fun中的局部变量重新分配Val编译时错误,parameters,kotlin,Parameters,Kotlin,在这里,我试图用b1更改a1的值,但它显示“val不能被重新分配编译时错误”。如果我不能像这样改变,那怎么可能呢 fun swap(a1: String, b1: String) { val temp = a1 a1 = b1 b1 = temp } 注意:这只是一个示例,了解为什么我不能像在Java中那样重新分配局部变量。您不能更改函数参数值,而是为交换的值创建新变量: fun swap(a1: String, b1: String) { val a1Swapped

在这里,我试图用b1更改a1的值,但它显示“val不能被重新分配编译时错误”。如果我不能像这样改变,那怎么可能呢

fun swap(a1: String, b1: String) {
   val temp = a1
   a1 = b1
   b1 = temp
}

注意:这只是一个示例,了解为什么我不能像在Java中那样重新分配局部变量。

您不能更改函数参数值,而是为交换的值创建新变量:

fun swap(a1: String, b1: String) {
    val a1Swapped = b1
    val b1Swapped = a1
}

在Kotlin
val
中声明了final、read-only和reference,这正是编译器错误告诉您的

无法重新分配Val

一旦将值分配给
val
,它就无法更改。如果您希望能够重新分配它,则必须将其声明为
var

在Kotlin中,方法参数隐式声明为final
val
,因此不能像在Java中那样重新分配它们


但是代码中的核心错误是您试图交换方法参数。由于方法参数是通过值传递的,而不是通过引用传递的,所以在Kotlin中不可能实现您想要实现的目标(就像在Java中不可能实现一样)。即使在方法调用中重新分配参数,传递给方法的原始变量也不会改变。

这里有两个误解:

首先,在Kotlin中,所有参数都是
final
,不能更改。正如在Java中一样,
final
引用不能更改。因此,尝试重新分配
final
val
引用时会出现错误

其次,因为您有一个字符串引用的副本,所以swap函数不会影响调用方的原始引用。您的交换函数在Java中也不起作用

例如,调用代码不起任何作用:

val s1 = "howdy"
val s2 = "goodbye"
swap(s1,s2)   // Java or Kotlin, doesn't matter
println(s1)
println(s2)

// output:
// howdy
// goodbye
swap("happy","day")  // what references is it supposed to be swapping?
用文字或表达式来调用它肯定没有任何作用:

val s1 = "howdy"
val s2 = "goodbye"
swap(s1,s2)   // Java or Kotlin, doesn't matter
println(s1)
println(s2)

// output:
// howdy
// goodbye
swap("happy","day")  // what references is it supposed to be swapping?
您只能交换与调用者具有相同引用的对象内部的内容。要制作交换例程,您可以执行以下操作:

data class MutablePair(var one: String, var two: String)

fun swap(pair: MutablePair) {  // not thread safe       
   val temp = pair.one
   pair.one = pair.two
   pair.two = temp
}
你可以称之为:

val stringies = MutablePair("howdy", "goodbye")
println("${stringies.one} ${stringies.two}")
swap(MutablePair()
println("${stringies.one} ${stringies.two}")

// output:
// howdy goodbye
// goodbye howdy

请注意:您的
swap
函数根本不会做任何事情。函数参数是本地的,对它们的赋值(Java中不禁止)不会改变函数之外的任何内容。此外,还可以将任意表达式传递给函数e。g<代码>交换(9,42)。这个赋值可能看起来很混乱,因此在Kotlin中是禁止的。现在,如果我尝试更改/赋值val a1Swapped=b1,然后是a1Swapped=4,则会显示相同的错误val无法重新赋值。该值不交换任何内容,在功能之外没有副作用。当然,我只是表明,您无法重新分配函数参数SSO Kotlin dosent支持重新分配要更改的args值,为此,我创建了一个新的var temp=a1 temp=b1。您能否更正此答案
val
不是常量,也不是不可变的,它是最终引用,使用可变/不可变会误导引用所指向的内容。他的错误不是直接关于
val
,而是关于在Kotlin中总是
final
的参数。