La función parcial anónima en el inicializador temprano requiere "acceso prematuro a la clase"
¿Por qué esto falla al compilar?
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
con el mensaje de error<$anon: Item => String> requires premature access to class Marquee
? Me parece que la función parcial no hace uso deMarquee
. Sin embargo, esto compila:
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
La primera versión, con la función parcial anónima dentroMarquee
, se compila cuandoval strings
no es una definición temprana (es decir, si eliminowith DummyTrait
) Supongo que es una pista importante, pero no he podido ver cómoDummyTrait
podría interferir con cualquier cosa. Alcance explícitoStringItem
comoMyModule.StringItem
entonces un descendiente deDummyTrait
no puede redefinir, tampoco funciona.