我的问题是如何在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..
答案 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
,那么请告诉我,我会尽我所能,但我很确定有人会回答,即使使用宏功能:)