早期初始化程序中的匿名部分函数需要“过早访问类”

时间:2014-12-15 22:25:00

标签: scala anonymous-function case-statement partial-functions

为什么这不能编译:

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

错误消息<$anon: Item => String> requires premature access to class Marquee?在我看来,部分功能不使用Marquee。然而,这编译:

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

第一个版本,在Marquee内部使用匿名部分函数,​​在val strings不是早期定义时(即,如果我删除with DummyTrait)会编译。我认为这是一个重要的线索,但我无法看到DummyTrait如何干扰任何事情。明确将StringItem范围限定为MyModule.StringItem,以便DummyTrait的后代无法重新定义它也不起作用。

0 个答案:

没有答案