有沒有辦法指定要復制的欄位copy,例如,將變數名稱作為函式中的引數傳遞?這是一個例子來說明我的意思。假設我們有以下內容:
val myData = User()
data class User(
val firstName: String = "",
val lastName: String = "",
val email: String = ""
)
我想做的是創建一個執行以下操作的函式:
fun update(fieldToBeUpdated: String, value: String) {
myData.update {
it.copy(fieldToBeUpdated = value)
}
}
當然,這行不通,因為編譯器說
找不到具有此名稱的引數:fieldToBeUpdated
有誰知道如何實作這一點,或者這在 Kotlin 中是不可能的?
uj5u.com熱心網友回復:
這是可能的,但它并不漂亮。第一件事是確保添加kotlin-reflect依賴項到您的pom.xml:
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
<version>your-kotlin-version</version>
</dependency>
然后您將需要一些反射功能來實作這一點。以下幾行應該可以解決問題:
import kotlin.reflect.full.instanceParameter
import kotlin.reflect.full.memberFunctions
fun main(args: Array<String>) {
val myData = User()
println(myData)
println(myData.update("firstName", "Test"))
}
fun User.update(fieldToBeUpdated: String, value: String): User {
val copy = this::class.memberFunctions.first { it.name == "copy" }
val instanceParameter = copy.instanceParameter!!
val parameterToBeUpdated = copy.parameters.first { it.name == fieldToBeUpdated }
return copy.callBy(mapOf(instanceParameter to this, parameterToBeUpdated to value)) as User
}
data class User(val firstName: String = "",
val lastName: String = "",
val email: String = "")
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/395316.html
標籤:科特林
上一篇:限制惰性列中的專案
