gpt4 book ai didi

scala - 可遍历递归节点结构

转载 作者:行者123 更新时间:2023-12-01 10:59:57 24 4
gpt4 key购买 nike

我正在尝试对节点结构实现递归遍历:

sealed class Node(subnodes: Traversable[Node]) extends Traversable[Node] {
def foreach[U](f: Node => U) {
f(this)
subnodes foreach f
}
}

case class Atom(id: String) extends Node(Nil)

case class Molecule(atoms: List[Node]) extends Node(atoms)

在像 Atom("test").toString 这样的元素上调用 toString 会导致堆栈溢出:

Exception in thread "main" java.lang.StackOverflowError
at java.lang.System.arraycopy(Native Method)
at java.lang.String.getChars(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at scala.collection.mutable.StringBuilder.append(StringBuilder.scala:197)
at scala.collection.TraversableOnce$class.addString(TraversableOnce.scala:297)
at Node.addString(Fail.scala:1)
at scala.collection.TraversableOnce$class.mkString(TraversableOnce.scala:263)
at Node.mkString(Fail.scala:1)
at scala.collection.TraversableLike$class.toString(TraversableLike.scala:615)
at Node.toString(Fail.scala:1)
at java.lang.String.valueOf(Unknown Source)
at scala.collection.mutable.StringBuilder.append(StringBuilder.scala:187)
at scala.collection.TraversableOnce$$anonfun$addString$1.apply(TraversableOnce.scala:300)
[...]
at Node.foreach(Fail.scala:3)
at scala.collection.TraversableOnce$class.addString(TraversableOnce.scala:298)
at Node.addString(Fail.scala:1)
at scala.collection.TraversableOnce$class.mkString(TraversableOnce.scala:263)
at Node.mkString(Fail.scala:1)
at scala.collection.TraversableLike$class.toString(TraversableLike.scala:615)
at Node.toString(Fail.scala:1)
at java.lang.String.valueOf(Unknown Source)
at scala.collection.mutable.StringBuilder.append(StringBuilder.scala:187)
at scala.collection.TraversableOnce$$anonfun$addString$1.apply(TraversableOnce.scala:300)

请注意,我没有在任何地方显式调用 foreach。那么为什么会出现堆栈溢出?

我用额外的 TraversableNode 类和从 NodeTraversableNode 的隐式转换解决了这个特殊问题,但我仍然想知道是什么导致堆栈溢出。谢谢。

最佳答案

当您在 Atom 上调用 toString 时,您将获得 Traversable 的那个,the documentation是这样描述的:

By default this string consists of the stringPrefix of this collection, followed by all elements separated by commas and enclosed in parentheses.

“后跟所有元素”部分已实现 in TraversableOnce通过调用集合的 foreach。由于您的 foreach 首先命中 Node 本身,您会立即陷入无限循环。

关于scala - 可遍历递归节点结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12037397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com