Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

432
Views
¿Cómo pasar una variable de la función principal a otra función y modificarla? (Kotlin)

Soy consciente de que un argumento pasado a una función se verá como "val", incluso si la variable se inicializó como "var". Pero esto ha sido un problema para mí. En este código de ejemplo a continuación, quiero modificar el valor de la variable "num" usando la función "changeNum". Pero, por supuesto, Kotlin no me permitirá modificarlo. ¿Cómo soluciono esto? ¿Cómo puedo usar la función "changeNum" para modificar la variable "num"?

 fun main() { var num: Int = 5 changeNum(num) } fun changeNum(num: Int){ num += 2 print(num) }
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Kotlin se pasa por valor, por lo que no puede hacerlo directamente con tipos primitivos como Int .

El enfoque habitual es simplemente devolver un nuevo valor en lugar de modificar lo que recibe como argumento (un enfoque funcional). Lo hace más claro desde la perspectiva del código de llamada:

 fun main() { var num: Int = 5 num = changeNum(num) } fun changeNum(num: Int): Int { val newValue = num + 2 print(newValue) return newValue }

Si realmente desea mutar la variable en lugar de devolver un nuevo valor, aquí hay 2 enfoques en los que estoy pensando para hacer esto:

  1. coloque todo el código que opera en este valor en una clase y haga que la variable local sea una propiedad de esa clase (este es el enfoque OO)
  2. poner esta variable primitiva en una clase y pasar una instancia de esa clase

La opción 1 se vería así:

 class SomeClass(var num: Int) { fun changeNum() { num += 2 print(num) } } fun main() { val container = SomeClass(5) container.changeNum() }

La opción 2 se vería así:

 class SomeMutableContainer(var num: Int) fun main() { val container = SomeMutableContainer(5) changeNum(container) } fun changeNum(container: SomeMutableContainer) { container.num += 2 print(container.num) }
over 4 years ago · Santiago Trujillo Report

0

Es posible hacer esto en Kotlin con una propiedad

 import kotlin.reflect.KMutableProperty0 var num = 1 fun main() { println(num) changeNum(::num) println(num) } fun changeNum(numProperty: KMutableProperty0<Int>) { numProperty.set(12345) } >> 1 >> 12345

Una KMutableProperty0 representa una var básica, por lo que puede pasar una referencia de propiedad utilizando la sintaxis ::num (igual que pasaría una referencia de función). De esa manera, en lugar de pasar el valor actual, está proporcionando a la función una referencia a la propiedad en sí, y luego puede llamar a set en ella.

Pero la pregunta es, ¿realmente quieres hacer esto? ¿O está complicando demasiado algo que debería hacerse de una manera más simple o más legible? En realidad, no puedes hacer esto con una variable , como si estuvieras tratando de hacerlo dentro de fun main() , solo propiedades en un objeto (vars de nivel superior, básicamente), pero incluso si pudieras, ¿por qué no lo harías? hacer esto en su lugar?

 fun main() { var num: Int = 5 ... num = changeNum(num) // this would need renaming but y'know }

sigue siendo una llamada de una línea, su función changeNum aún puede tener efectos secundarios, validar, etc., simplemente devuelve el resultado en lugar de configurarlo como un efecto secundario. Esto es mucho más fácil de seguir, especialmente cuando es la forma habitual de establecer un valor en una cosa.


Si realmente quiere usar referencias, pero hacerlas de nivel superior en su clase es complicado, entonces tal vez considere crear un objeto de estado en su lugar:

 import kotlin.reflect.KMutableProperty0 data class AllThemNums(var num1 :Int = 1, var num2: Int = 9999) fun main() { val nums = AllThemNums(num1 = 5) changeNum(nums::num1) println(nums) } fun changeNum(numProperty: KMutableProperty0<Int>) { numProperty.set(numProperty.get() + 2) } >> AllThemNums(num1=7, num2=9999)

¡incluso podría poner la función changeNum dentro de la clase de datos!

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!