如何在Scala中迭代对象(包括嵌套对象)

时间:2014-07-22 21:13:00

标签: scala

我的问题是如何在Scala中嵌入对象时如何迭代它们?

object Foo {

  case object A extends FirstLevel {
    sealed trait SecondLevel
    case object A1 extends SecondLevel {
      println("you're in A1")
    }
  }

  case object B extends FirstLevel {
    sealed trait SecondLevel
    case object B1 extends SecondLevel {
      sealed trait ThirdLevel
      case object B1B extends ThirdLevel{
        println("now you're in B1B")
      }
    }
  }

}

bar(Foo.FirstLevel) foreach { f =>
  println(f{
  bar(f.SecondLevel foreach { s =>
    println(s)
    bar(s.ThirdLevel) ...
  }
}

// A, A1, B, B1, B1B... // and so on..

我在these questions上完成答案时已经接近了,但他们只对一个级别有用。

1 个答案:

答案 0 :(得分:0)

如果你讨厌包含迭代对象的代码'名字两次,如:

object Content1 {...}
object Content2 {...}
object Content3 {...}
val iterated = Seq(Content1, Content2, Content3)

然后必须使用宏功能,我不熟悉它们:P 此外,如果您需要以某种方式键入该功能,请等待另一个答案,因为它应该需要TypeTag s,我认为我没有足够的知识。

否则,我的意思是,如果有任何东西可以是迭代的对象,那么让所有的父母都继承一些Traversable,并制作一个类似的方法:

def iterateAnies(s: Any)(f: Any => Unit) {
  f(s)
  s match {
    case s: Traversable[_] => s.foreach(iterateAnies(_)(f))
    case _ =>
  }
}

如果对象需要为HAS-A,则创建另一个具有Traversable[_]的特征并修改iterateAnies方法,使其具有s的特征,具有{{1}也接受了这个特性,而f部分会被颠倒过来:

match

有了这个,你可以打印出trait HasTraversable { def traversable: Traversable[_] } def iterateAnies(s: HasTraversable)(f: HasTraversable => Unit) { f(s) s.traversable.foreach(_ match { case c: HasTraversable => iterateAnies(c) case _ => }) } 做的事情:

toString

要跟踪深度,请为val something: Any = ... //or HasTraversable iterateAnies(something)(println(_.toString)) iterateAnies(something)(println(_ match { case s: String => "text" case s: Int => "number" case s: _ => "idk" )}) iterateAnies添加一个Int参数,并在该过程中增加该值。

如果没有人回答,你需要输入f,那么请告诉我,我会尽我所能,但我很确定有人会回答,即使使用宏功能:)