4

作为一个思考练习,我想知道是否有可能制作一个 scala 特征,在当前对象中深度搜索满足该定义的其他项目,并调用它们。例如:

trait CanDebug { this =>

  def depthFirstDebug(level:Int) {
    for ( x<-(this object search matching type CanDebug)) {
      x.depthFirstDebug(level+1)

    }
    println("level "+level+" "+this.toString)
  }

}

case class A (s:String) extends CanDebug 

class B extends CanDebug {
  val a1 = A("Hello")      //automatically located by CanDebug by it's type
  val a2 = A("World")
  override def toString = "Start"
}

val b =new B
b.depthFirstDebug(0)

输出以下内容:

1 级你好
1 级世界
0 级开始

使用 Scala 2.10.2,我相信这应该可以使用反射,但我不确定后勤工作。谢谢

4

1 回答 1

3

您可以使用 Mirrors 进行反射this,然后调用所需的方法:

import scala.reflect.runtime.universe._
import scala.reflect.runtime.currentMirror

def depthFirstDebug(level:Int) {
  val mirror = currentMirror.reflect(this)
  val tpe = mirror.symbol.typeSignature

  for {
    m <- tpe.members
    if  m.typeSignature <:< typeOf[CanDebug]
    if  m.isTerm
    if !m.isMethod
  } {
    val fld = mirror.reflectField(m.asTerm)
    fld.get.asInstanceOf[CanDebug].depthFirstDebug(level + 1)
  }
  println("level "+level+" "+this.toString)
}

现在你可以:

val b =new B
b.depthFirstDebug(0)

这给了你:

level 1 A(World)
level 1 A(Hello)
level 0 Start
于 2013-08-15T17:39:42.297 回答