Почему это не компилируется:
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
не мог переопределить его, также не работает.
val pairs: Seq[(Item, Item)] = items.map { item => (item, item) }
, поэтому я полагаю, что ограничение действительно не против анонимных функций. - person Ben Kovitz   schedule 16.12.2014PartialFunction
? Если вы делаетеval collector: PartialFunction[Item, String] = {case si: StringItem => si.makeString}
, это запрещено? - person lmm   schedule 16.12.2014