如何访问类参数?

时间:2019-02-21 02:32:34

标签: scala

根据 Scala编程,第304页

class Queue[T] private (leading: List[T], trailing: List[T]){
  private def mirror =
    if(leading.isEmpty) new Queue(trailing.reverse, Nil)
    else this
  def head = mirror.leading.head
  def tail = {
    val q = mirror
    new Queue(q.leading.tail, q.trailing)
  }
  def append[T](x: T)={
    new Queue(leading, x::trailing)
  }
}

我遇到以下错误

Error:value leading is not a member of Queue[T]
def head = mirror.leading.head

trailing相同的错误。 mirrorQueue类的对象,对吗?为什么它无法访问其类参数?

1 个答案:

答案 0 :(得分:2)

独立leadingtrailingQueue类的成员,但默认情况下它们是私有的。要使其公开,请添加val批注:

之前:

scala> class Queue[T] private (leading: List[T], trailing: List[T]){
     |   private def mirror =
     |     if(leading.isEmpty) new Queue(trailing.reverse, Nil)
     |     else this
     |   def head = mirror.leading.head
     |   def tail = {
     |     val q = mirror
     |     new Queue(q.leading.tail, q.trailing)
     |   }
     |   def append[T](x: T)={
     |     new Queue(leading, x::trailing)
     |   }
     | }
<console>:15: error: value leading is not a member of Queue[T]
         def head = mirror.leading.head
                           ^
<console>:18: error: value leading is not a member of Queue[T]
           new Queue(q.leading.tail, q.trailing)
                       ^
<console>:18: error: value trailing is not a member of Queue[T]
           new Queue(q.leading.tail, q.trailing)
                                       ^

之后:

scala> class Queue[T] private (val leading: List[T], val trailing: List[T]){
     |   private def mirror =
     |     if(leading.isEmpty) new Queue(trailing.reverse, Nil)
     |     else this
     |   def head = mirror.leading.head
     |   def tail = {
     |     val q = mirror
     |     new Queue(q.leading.tail, q.trailing)
     |   }
     |   def append[T](x: T)={
     |     new Queue(leading, x::trailing)
     |   }
     | }
defined class Queue

您可以详细了解here的构造函数和获取方法。相关点是:

  

不带valvar的参数是私有值,仅在   班级。