在 Scala 中转换一棵玫瑰树

Transforming a Rose Tree in Scala

This posting 展示了如何在 Scala 中遍历一棵玫瑰树。我想做类似的事情:在玫瑰树中的每个 CNode 上调用一个方法。这是 CNode 定义:

case class CNode(
  name: String,
  helpMessage: String = "",
  children: List = Nil,
  alias: String = ""
)

方法定义如下:

def node(objects: AnyRef*): SomeReturnValue

这里是一些测试数据:

val cNodes = List(
  CNode("account",
    helpMessage = "Account management", children =  List(
      CNode("import", children = List(CNode("<keyfile>"))),
      CNode("list",   helpMessage = "List accounts"),
      CNode("new",    helpMessage = "Create a new account"),
      CNode("update", children = List(CNode("<accountAddress>")))
    )
  ),
  CNode("javascript"),
  CNode("help")
)

所以,我想完成的是将上面的List[CNode]转换成这样的递归调用结构:

val result = List(
  node("account", children = List(
    node("import", children = List(node("<keyfile>"))),
    node("list"),
    node("new"),
    node("update", children = List(node("<accountAddress>")))
  ),
  node("javascript"),
  node("help")
)

骑车回家我发现有一个非常简单的方法可以解决这个问题:

implicit def cNodeToNode(cNode: CNode): Node = 
  node(cNode.name :: cNode.children.cNodes.map(cNodeToNode).toList: _*)