微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scala – 无法在抽象类中导入案例类

我想在下面运行Expr类.我从 http://andymaleh.blogspot.ie/2008/04/scalas-pattern-matching-visitor-pattern.html开始使用此代码

这是我正在尝试的:

import Expr.Sum

object Main {

    def main(args:Array[String]) {

      var expr1 = new Sum(new Num(1),new Prod(new Num(2),new Num(3)))
      print(expr1)
  }

}

abstract class Expr {

  case class Num(n: Int) extends Expr
  case class Sum(l: Expr,r: Expr) extends Expr
  case class Prod(l: Expr,r: Expr) extends Expr

  def evalExpr(e: Expr): Int = e match {
    case Num(n) => n
    case Sum(l,r) => evalExpr(l) + evalExpr(r)
    case Prod(l,r) => evalExpr(l) * evalExpr(r)
  }

  def printExpr(e: Expr) : Unit = e match {
    case Num(n) => print(" " + n + " ")
    case Sum(l,r) => printExpr(l); print("+"); printExpr(r)
    case Prod(l,r) => printExpr(l); print("x"); printExpr(r)
  }

}

但行

import Expr.Sum

导致编译时错误:’not found:object Expr’.如何导入Expr类?

解决方法

您只能导入实例的成员.所以你的代码是:

object Main {
    def main(args:Array[String]) {
      val expr = new Expr {} // Now we have a instance.

      import expr._
      var expr1 = new Sum(new Num(1),new Num(3)))
      print(expr1)
  }
}

一个简单的例子解释了为什么你不能导入非实例成员:

class A(val x:Int) {
  object Print { def print = println(x) }
}

如果你可以导入A.Print,哪个值会绑定到x?现在如果我们这样做:

val a = new A(5); // we have a value bound to x.
import a._
Print.print

这是一个原因.另一个原因是新的A(5).Print!= new A(5).Print,不仅在相等方面,而且在类型中:val(a1,a2)=(new A(5),new A(5) );含蓄地[a1.Print<:< a2.Print]不会编译.这就是Scala所谓的路径依赖类型.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐