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

ミラーを使用して反映し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 に答える