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 回答