首页 > 解决方案 > 如何访问类参数?

问题描述

根据《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

相同的错误trailingmirror是类的对象Queue吗?为什么它不能访问它的类参数?

标签: scala

解决方案


确实leading,并且trailingQueue类的成员,但默认情况下它们是私有的。要使它们公开添加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

您可以在此处详细了解构造函数和 getter 。相关点是:

没有val或的参数var是私有值,仅在类中可见。


推荐阅读