Шаблон для класса, который представляет собой список - PullRequest
3 голосов
/ 03 декабря 2010

Рассмотрим следующее:

object Main
{
  case class Foo(bar: Int) extends FooList {
    val self: List[Foo] = this :: Nil
  }

  abstract class FooList {
    val self: List[Foo]
    def ~(that: Foo) = { val list = self :+ that; new FooList { val self = list } }
  }

  def main(args: Array[String]): Unit = {
    val foo = Foo(1) ~ Foo(2) ~ Foo(3)
    println(foo.self)
 }
}

Может ли эта строка:

{ val list = self :+ that; new FooList { val self = list } }

быть упрощена каким-либо образом?Я хотел бы написать что-то вроде:

new FooList { val self = this.self :+ that }   // won't compile

Кажется, все сводится к возможности ссылаться на идентификаторы разной области действия, которые имеют одинаковые имена.Есть ли механизм для этого?

1 Ответ

13 голосов
/ 03 декабря 2010

Это решает проблему определения объема. Если я правильно понимаю, это то, что вы хотите.

abstract class FooList { outer =>
  val self: List[Foo]
  def ~(that: Foo) = { new FooList { val self = outer.self :+ that } }
}

Ответ: Да . Self-типы могут также использоваться в качестве псевдонимов для внешних областей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...