No se puede actualizar el valor del parámetro del método Kotlin

He seguido el método de Kotlin

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

El comstackdor de Kotlin da el siguiente error Error:(6, 8) Val cannot be reassigned

¿Qué pasa con la actualización de la variable?

    Los parameters de una function dentro de la function son de solo lectura (como las variables creadas con val ), por lo tanto, no pueden reasignarse.

    Puede ver las discusiones sobre esta decisión de layout aquí y aquí .

    ¿Qué pasa con la actualización de la variable?

    Los otros responden la pregunta diciendo efectivamente "porque los parameters de la function de Kotlin son inmutables". Por supuesto, esa es una (la) respuesta correcta.

    Pero dado el hecho de que tantos idiomas, incluido Java , le permiten volver a asignar los parameters de la function, podría ser válido interpretar su pregunta como "¿por qué Kotlin no permite volver a asignar los parameters de la function?"

    Mi respuesta : Kotlin y Swift tienen muchas características en común, así que fui a Swift 3 para ver por qué decidieron desaprobar la reasignación de parameters de function y encontraron esta motivación .

    El uso de var annotations en los parameters de la function tiene una utilidad limitada, la optimization de una línea de código a costa de la confusión con inout, que tiene la semántica que la mayoría de la gente espera. Para enfatizar el hecho de que estos valores son copys únicas y no tienen la semántica de escritura regresiva inout, no deberíamos permitir var aquí.

    En resumen, los problemas que motivan este cambio son:

    • var se confunde a menudo con inout en los parameters de la function.

    • var a menudo se confunde para hacer que los types de valor tengan semántica de reference.

    • Los parameters de function no son patrones refutables como en sentencias if-, while-, guard-, for-in y case.

    Por supuesto, Kotlin no inout decoración. Pero los escritores podrían haber elegido permitir val y var , siendo val el valor pnetworkingeterminado. Entonces habrían tenido un comportamiento consistente con muchos otros idiomas. En cambio, optaron por la claridad del código.

    El código de ejemplo de OP muestra un ejemplo válido de cuando la reasignación de parameters es clara y natural. Tener que agregar una línea más a una function muy corta (para get una variable local para hacer lo que la variable de parámetro podría haber hecho) en mi humilde opinión networkinguce la claridad. Nuevamente, en mi humilde opinión, hubiera preferido opcionalmente poder declarar mis parameters como var .

    En Kotlin, los parameters del método son tipo val (no mutable) y no tipo var (mutable) . Similar a java final . Es por eso que no puedo mutar (cambiar) eso.

    El error que viste tiene más que ver con el scope. El parámetro de una function por layout es inmutable o más preciso, de solo lectura y eso es lo que representa la palabra key val , por eso se ve ese error.