Kotlin 如何从作为toString覆盖中的属性的hashMap打印多个属性
我正在学习Kotlin并编写代码来检查我的理解。我正在尝试使用toString重写来打印作为类属性的hashMap的值。我不能让它工作。相反,我得到的输出类似于“kotlin.Unit()->kotlin.Unit”。另外,我不明白为什么hashMap的值在toString输出之前打印出来。我不知道这些输出是从哪里来的。请帮帮我。谢谢下面是我的代码和我得到的输出。 代码:Kotlin 如何从作为toString覆盖中的属性的hashMap打印多个属性,kotlin,Kotlin,我正在学习Kotlin并编写代码来检查我的理解。我正在尝试使用toString重写来打印作为类属性的hashMap的值。我不能让它工作。相反,我得到的输出类似于“kotlin.Unit()->kotlin.Unit”。另外,我不明白为什么hashMap的值在toString输出之前打印出来。我不知道这些输出是从哪里来的。请帮帮我。谢谢下面是我的代码和我得到的输出。 代码: 再次感谢您的帮助。您不应该在toString()中使用print()或println()函数,因为它们会立即将参数输出到标准
再次感谢您的帮助。您不应该在
toString()
中使用print()
或println()
函数,因为它们会立即将参数输出到标准输出中,而不是将其附加到返回给调用方的字符串中
让我们检查您得到的输出kotlin.Unit()->kotlin.Unit
。它由两部分组成:
是kotlin.Unit
表达式属性的字符串表示形式!!。forEach{…}
函数返回时不带值,在Kotlin中,它通过返回对象值来表示。它的字符串表示形式将附加到要返回的字符串中forEach
- 第二部分,
,也是表达式()->kotlin.Unit
的字符串表示形式。此函数不带参数,返回时不带值,这意味着其类型为{for((attrName,value)in…}
。请注意,在Kotlin中,块()->Unit
声明了一个局部lambda函数。如果您想在该块内部运行代码,请使用{…}
函数:run
run{…}
toString
函数的目标是构建对象的字符串表示。为此,您可以使用以下功能:
override fun toString() = buildString {
append("Person(name=\"${name?:""}\", age=${age?:99999}, isMarried=$isMarried) ")
append("${_attributes?.get("name")} ").append("$name ")
this._attributes!!.forEach { (attrName, value) -> append("$attrName = $value") }
for ((attrName, value) in this._attributes!!) {
append("attribute $attrName = ${this._attributes!![attrName]}")
}
}
此函数创建一个
StringBuilder
并将其作为传递,在该接收器上调用append
或appendln
。然后buildString
将该字符串生成器转换为字符串并返回它。我让它这样工作:override-fun-toString()=buildString{append(“Person(name=\”${name:“}\”,age=${age?:99999},isMarried=$isMarried)\n“/”${u-attributes?.get(“name”)}+“$name”+//这个。{u attributes!!.forEach((attrName,value)->append($attrName=$value)for((attrName,value)in{u attributes!!){append($attrName=${u attributes!![attrName]}\n”)}非常感谢您的帮助和解释。没有您,我无法完成这项工作。
name = Bob
company = JetBrains
lastname = Jones
Person(name="Bob", age=89, isMarried=false) Bob Bob kotlin.Unit() -> kotlin.Unit
override fun toString() = buildString {
append("Person(name=\"${name?:""}\", age=${age?:99999}, isMarried=$isMarried) ")
append("${_attributes?.get("name")} ").append("$name ")
this._attributes!!.forEach { (attrName, value) -> append("$attrName = $value") }
for ((attrName, value) in this._attributes!!) {
append("attribute $attrName = ${this._attributes!![attrName]}")
}
}