Anonyme Teilfunktion in der frühen Initialisierung erfordert "vorzeitigen Zugriff auf die Klasse"

Warum kann dies nicht kompiliert werden:

trait Item

trait StringItem extends Item {
  def makeString: String
}

trait SomeOtherItem extends Item

trait DummyTrait

case class Marquee(items: Seq[Item]) extends {
  val strings: Seq[String] = items.collect {
    case si: StringItem => si.makeString   // <-- partial function inside braces
  }
} with DummyTrait

mit der Fehlermeldung<$anon: Item => String> requires premature access to class Marquee? Es scheint mir, dass die Teilfunktion keine Verwendung von @ macMarquee. Doch dies kompiliert:

val pf: PartialFunction[Item, String] = {
  case si: StringItem => si.makeString
}

case class Marquee(items: Seq[Item]) extends {
  val strings: Seq[String] = items.collect(pf)
} with DummyTrait

Die erste Version mit der anonymen Teilfunktion inMarquee, kompiliert, wennval strings ist keine frühe Definition (dh wenn ich @ entferwith DummyTrait). Ich denke, das ist ein wichtiger Hinweis, aber ich konnte nicht sehen, wieDummyTrait könnte alles stören. Explizites ScopingStringItem wieMyModule.StringItem so ein Nachkomme vonDummyTrait kann nicht neu definiert werden, es funktioniert auch nicht.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage