1

自分自身をメンバーとして保持するクラスを使用する場合に注意すべきことはありますか?

これはうまくいきます (Scala-IDE の Scala Worksheet からのものです) が、これはある時点で私を苦しめます。

object Play {

 println("Playing a bit")                         //> Playing a bit

 case class X(a: Int = 1, x: List[X]){
 }

 val y = X(3, List())                             //> y  : Play.X = X(3,List())
 val z = X(5, List(X(6, List())))                 //> z  : Play.X = X(5,List(X(6,List())))
 println(z)                                       //> X(5,List(X(6,List())))
 println(z.x.head.a)                              //> 6
}
4

1 に答える 1

3

これは、ケース クラスの完全に優れた使用法です。ケース クラスは、このような再帰構造を定義するのに最適です。

たとえば、独自のリンク リスト クラスを定義したい場合、ケース クラスを使用して簡単なパターン マッチング機能を実現できます。

trait MyList[T]
case class Link[T](head: T, tail: MyList[T]) extends MyList[T]
case class End[T]() extends MyList[T]

@tailrec
def last[T](list: MyList[T]): Option[T] =
  list match {
    case End() => None
    case Link(head, End()) => Some(head)
    case Link(head, tail) => last(tail)
  }

println(last(Link(1, Link(2, Link(3, End())))))  // Some(3)
println(last(Link(1, End())))                    // Some(1)
println(last(End()))                             // None
于 2012-09-27T07:08:02.327 に答える