在没有案例课程的情况下玩Nat

时间:2014-08-19 14:24:40

标签: scala pattern-matching unapply

我只是在Scala中为Naturals创建一个定义,还有一个PLUS操作:

abstract class Nat {

  def +(other:Nat):Nat = this match {
    case Zero => other
    case Succ(x) => x + Succ(other)
  }

}

object Zero extends Nat {
  override def toString = "Zero"
}

对于Succ的定义,我尝试不使用Case类,用于学习目的。我的第一个方法是:

class Succ(x: Nat) extends Nat {
  override def toString = "Succ(" + x.toString + ")"
}

object Succ {
  def apply(x: Nat) = new Succ(x)

  def unapply(s: Succ) = Some(s.x)
}

但是编译器抛出了一个错误

Error:(  , ) value x is not a member of Succ
  def unapply(s: Succ) = Some(s.x)
                              ^

我为get X制作了一个显式方法,它可以正常工作

class Succ(x: Nat) extends Nat {

  def getX = x

  override def toString = "Succ(" + x.toString + ")"
}

object Succ {
  def apply(x: Nat) = new Succ(x)

  def unapply(s: Succ) = Some(s.getX)

}

为什么?

1 个答案:

答案 0 :(得分:2)

构造函数参数仅在类中可见。如果你想让它成为一个领域,你必须这样说:

class Succ(val x: Nat) extends Nat { … }
//         ^^^