En C# hay un tipo de clase que se llama "registro" que es más o menos lo mismo que una clase de "datos" en Kotlin.
Al usar un registro en C#, puede usar la palabra clave "con" para crear una nueva instancia de su registro con algunas propiedades establecidas en valores específicos (consulte https://docs.microsoft.com/en-us/dotnet/csharp/ referencia-idioma/operadores/con-expresión )
Me preguntaba si hay una forma similar de hacerlo en kotlin. No puedo encontrar nada con respecto a eso, y la forma en que lo hago por ahora es definiendo la función que hace el trabajo, pero a veces puede ser un poco repetitivo, y se supone que usar la clase de datos me evita ese trabajo repetitivo.
También preferiría evitar el uso de propiedades "var" (para tener instancias inmutables), de ahí mi pregunta.
Kotlin tiene clases de datos, que están cerca de los registros de C#. Como puede ver en la documentación de Kotlin:
No es inusual crear clases cuyo objetivo principal es almacenar datos. En tales clases, algunas funciones estándar y algunas funciones de utilidad a menudo se derivan mecánicamente de los datos. En Kotlin, se denominan clases de datos y se marcan con datos:
data class User(val name: String, val age: Int)El compilador deriva automáticamente los siguientes miembros de todas las propiedades declaradas en el constructor principal:
equals()/ hashCode() pair toString() of the form "User(name=John, age=42)" componentN() functions corresponding to the properties in their order of declaration. copy() function (see below).
La última línea muestra que el compilador genera automáticamente una función de copy para una clase de datos, y esto es lo que está buscando
Nuevamente de la documentación, el uso sería:
Utilice la función copy() para copiar un objeto, lo que le permite modificar algunas de sus propiedades y mantener el resto sin cambios. [...] A continuación, puede escribir lo siguiente:
val jack = User(name = "Jack", age = 1) val olderJack = jack.copy(age = 2)
Con una clase de datos, puede usar el método de copy :
val someData = SomeClass(a = 1, b = 2) val modifiedData = someData.copy(b = 0) // modifiedData = SomeClass(a = 1, b = 0)¿Quiere decir algo como la función copy() que se genera automáticamente para las clases de datos?
fun main() { val foo1 = Foo("foo", 5) val foo2 = foo1.copy(value1 = "bar") val foo3 = foo2.copy(value2 = 10) } data class Foo( val value1: String, val value2: Int, )