给出Kotlin数据类,如何将非空属性初始化为指向self的指针?即类似以下的伪代码。
data class Node(var other: Node = this)
目前,我有一个介绍临时属性的解决方案
data class Node(val _other: Node? = null) {
var other: Node = _other ?: this
}
答案 0 :(得分:2)
这是不可能的。 this
不能在构造之前访问。但这就是默认构造函数参数的工作方式。
Cannot access '<this>' before superclass constructor has been called
答案 1 :(得分:1)
谢谢您的反馈,但是,出于我的目的,我需要equals和copy之类的数据类的功能,并且我不希望使该属性为可空性和/或手动实现该功能。
您仍然必须:equals
和copy
仅关心_other
并忽略other
(就像它们将忽略正文中定义的所有其他属性一样)类)。 other
是var
只会使情况变得更糟:重新分配它不会对数据类功能产生影响。
但是您可以靠近:
data class Node(private var _other: Node? = null) {
var other: Node
get() = _other ?: this
set(value) {
_other = if (value != this) value else null
}
}
唯一的问题是component1()
将返回_other
。在这种情况下,您只有一个属性,所以没关系。
编辑:再想一想,
data class Node(private var _other: Node? = null) {
init {
this._other = _other ?: this
}
var other: Node
get() = _other!! // safe
set(value) {
_other = value
}
}
似乎有效地成为了您想要的。您可以在这里看到区别:
val node1 = Node()
val node2 = node1.copy(node1)
println(node1 == node2)
使用第一个解决方案打印false
,使用第二个解决方案打印true
(如果this
是默认参数,则应该打印)。