Val не может переназначить ошибку времени компиляции для локальной переменной в fun в kotlin

Здесь в fun swap я пытаюсь изменить значение a1 с b1, но он показывает, что val не может переназначить ошибку времени компиляции. если я не могу изменить это, то как это сделать.

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

Примечание: это всего лишь образец, чтобы узнать, почему я не могу переназначить локальную переменную, как мы можем сделать в java

В Kotlin val объявляется окончательный, только для чтения, ссылка – и это именно то, что сообщение об ошибке компилятора сообщает вам

Val не может быть переназначен

Когда вы назначаете значение val , его нельзя изменить. Если вы хотите переназначить его, вы должны объявить его как var

Параметры метода Kotlin неявно объявляются как final val , поэтому вы не можете переназначить их так же, как вы могли бы на Java.

Но основная ошибка в вашем коде заключается в том, что вы пытаетесь изменить параметры метода. Поскольку параметры метода передаются по значению, а не по ссылке, чего вы хотите достичь, невозможно в Котлине (так же, как это невозможно в Java). Даже если вы переназначаете параметры внутри метода, исходные переменные, переданные методу, не будут меняться.

Здесь есть два недоразумения:

Во-первых, в Котлине все параметры являются final и это невозможно изменить. Как и в Java, final ссылка не может быть изменена. Таким образом, вы получаете сообщение об ошибке при попытке переназначить final ссылку или ссылку на значение val .

Во-вторых, поскольку у вас есть копия ссылки на String, ваша функция подкачки не повлияет на исходные ссылки вызывающего. Ваша функция обмена не будет работать и в 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? 

Вы можете обменивать содержимое только внутри объекта, для которого вы используете ту же ссылку, что и вызывающий. Чтобы сделать подкачку, вы бы сделали что-то вроде:

 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 

Вы не можете изменить значение параметра функции, вместо этого создайте новые переменные для измененных значений:

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