2

假设我有一个fn接受以下形式的元组的函数:

fn(
 "a" -> (
   "b" -> "k",
   "c" -> 293,
   "d" ->(
     "e" -> Seq("i", "j"),
     "f" -> Seq(1, 2)
     )
   ),
 "g" -> (
   "h" -> true
  )
)

我不知道如何实现fn能够遍历每个叶子(分别是“b”、“c”、“e”、“f”,最后是“h”),每次知道叶子自己的父母。

Shapeless 似乎是一个解决方案,即使我不知道如何实现它。

注意:首选香草 scala 方法(如果可能的话)。注意:我知道我有一个Tuple2(String, T),其中 T 可以是另一个 Tuple(String, T)、一个字符串、一个数字、一个布尔值或一个 Seq[V]。注意: Seq[V] 其中 V 可以是字符串、数字或布尔值。

4

1 回答 1

1

我不确定你所说的“每次都知道叶子自己的父母”是什么意思,但你应该能够调整它来做你需要的事情:

  def traverseLeaves(p: Product)(visitor: (String,Any) => Unit):Unit = p match { 
    case (parent:String, child:Seq[_]) => visitor(parent, child)
    case (_:String, child: Product) => traverseLeaves(child)(visitor)
    case (parent:String, child) => visitor(parent, child)
    case _ => p.productIterator.foreach { 
      case child:Product => traverseLeaves(child)(visitor)
      case _ => ???
    }
  }

请注意,如果它在任何地方找到一个多于两个元素的元组,包含元组以外的任何内容,这将引发异常,因为从您的问题中不清楚您打算在这种情况下做什么。如果您想以不同的方式处理它,请将 更改为???将处理该情况的逻辑。

于 2016-03-14T18:54:02.573 回答