案例类是否可以拥有自己的成员?

时间:2012-09-27 07:06:11

标签: scala

当我使用保持自己成员的课程时,有什么值得注意的吗?

这是有效的(它来自Scala-IDE中的Scala工作表),但这会让我在某些方面受到伤害,即这是正常的做法还是不好的做法以及为什么?

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
}

1 个答案:

答案 0 :(得分: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