Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何从作为toString覆盖中的属性的hashMap打印多个属性_Kotlin - Fatal编程技术网

Kotlin 如何从作为toString覆盖中的属性的hashMap打印多个属性

Kotlin 如何从作为toString覆盖中的属性的hashMap打印多个属性,kotlin,Kotlin,我正在学习Kotlin并编写代码来检查我的理解。我正在尝试使用toString重写来打印作为类属性的hashMap的值。我不能让它工作。相反,我得到的输出类似于“kotlin.Unit()->kotlin.Unit”。另外,我不明白为什么hashMap的值在toString输出之前打印出来。我不知道这些输出是从哪里来的。请帮帮我。谢谢下面是我的代码和我得到的输出。 代码: 再次感谢您的帮助。您不应该在toString()中使用print()或println()函数,因为它们会立即将参数输出到标准

我正在学习Kotlin并编写代码来检查我的理解。我正在尝试使用toString重写来打印作为类属性的hashMap的值。我不能让它工作。相反,我得到的输出类似于“kotlin.Unit()->kotlin.Unit”。另外,我不明白为什么hashMap的值在toString输出之前打印出来。我不知道这些输出是从哪里来的。请帮帮我。谢谢下面是我的代码和我得到的输出。 代码:


再次感谢您的帮助。

您不应该在
toString()
中使用
print()
println()
函数,因为它们会立即将参数输出到标准输出中,而不是将其附加到返回给调用方的字符串中

让我们检查您得到的输出
kotlin.Unit()->kotlin.Unit
。它由两部分组成:

  • kotlin.Unit
    属性的字符串表示形式!!。forEach{…}
    表达式
    forEach
    函数返回时不带值,在Kotlin中,它通过返回对象值来表示。它的字符串表示形式将附加到要返回的字符串中
  • 第二部分,
    ()->kotlin.Unit
    ,也是表达式
    {for((attrName,value)in…}
    的字符串表示形式。此函数不带参数,返回时不带值,这意味着其类型为
    ()->Unit
    。请注意,在Kotlin中,块
    {…}
    声明了一个局部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]}")
    }
  }