Kotlin 委托 属性 setValue 无法保留
Kotlin delegated property setValue cannot be kept
我正在 Kotlin 文档站点阅读这篇关于 Delegated properties
的 page。
import kotlin.reflect.KProperty
class Example {
var p: String by Delegate() // 1
override fun toString() = "Example Class"
}
class Delegate() {
operator fun getValue(thisRef: Any?, prop: KProperty<*>): String { // 2
return "$thisRef, thank you for delegating '${prop.name}' to me!"
}
operator fun setValue(thisRef: Any?, prop: KProperty<*>, value: String) { // 2
println("$value has been assigned to ${prop.name} in $thisRef")
}
}
fun main() {
val e = Example()
println(e.p)
e.p = "NEW"
}
输出为:
Example Class, thank you for delegating 'p' to me!
NEW has been assigned to p in Example Class
而且我能理解结果。
但我的问题是,如果我在将 e.p
的值设置为 NEW
:
后再次打印它会怎样?
fun main() {
val e = Example()
println(e.p)
e.p = "NEW"
println(e.p) // print it again after setting new value on it
}
我希望它打印 NEW
。但实际结果是,它与第一个 println 相同:Example Class, thank you for delegating 'p' to me!
.
位于 here 的 Kotlin 游乐场。
似乎 e.p = "NEW"
无法正确更改值。是什么原因造成的?如果我想设置值NEW
怎么办?
您的委托 class 实例完全接管了 属性 的 getter 和 setter 所做的事情。由于您的委托的 setValue
函数实际上并未将 passed-in 值存储在任何内部 属性 中,因此 getValue
函数无法检索并 return 它。事实上,代码中 getValue()
的实现只是生成一个 String 并 returning 那个。
当您获得委托 属性 的值时,它 return 是您在 getValue()
中的委托 return 的值,因此行为取决于您如何对你的代表进行编程 class.
我正在 Kotlin 文档站点阅读这篇关于 Delegated properties
的 page。
import kotlin.reflect.KProperty
class Example {
var p: String by Delegate() // 1
override fun toString() = "Example Class"
}
class Delegate() {
operator fun getValue(thisRef: Any?, prop: KProperty<*>): String { // 2
return "$thisRef, thank you for delegating '${prop.name}' to me!"
}
operator fun setValue(thisRef: Any?, prop: KProperty<*>, value: String) { // 2
println("$value has been assigned to ${prop.name} in $thisRef")
}
}
fun main() {
val e = Example()
println(e.p)
e.p = "NEW"
}
输出为:
Example Class, thank you for delegating 'p' to me!
NEW has been assigned to p in Example Class
而且我能理解结果。
但我的问题是,如果我在将 e.p
的值设置为 NEW
:
fun main() {
val e = Example()
println(e.p)
e.p = "NEW"
println(e.p) // print it again after setting new value on it
}
我希望它打印 NEW
。但实际结果是,它与第一个 println 相同:Example Class, thank you for delegating 'p' to me!
.
位于 here 的 Kotlin 游乐场。
似乎 e.p = "NEW"
无法正确更改值。是什么原因造成的?如果我想设置值NEW
怎么办?
您的委托 class 实例完全接管了 属性 的 getter 和 setter 所做的事情。由于您的委托的 setValue
函数实际上并未将 passed-in 值存储在任何内部 属性 中,因此 getValue
函数无法检索并 return 它。事实上,代码中 getValue()
的实现只是生成一个 String 并 returning 那个。
当您获得委托 属性 的值时,它 return 是您在 getValue()
中的委托 return 的值,因此行为取决于您如何对你的代表进行编程 class.