加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:53:01 所属栏目:安全 来源:网络整理
导读:我想在下面运行Expr类.我从 http://andymaleh.blogspot.ie/2008/04/scalas-pattern-matching-visitor-pattern.html开始使用此代码 这是我正在尝试的: import Expr.Sumobject Main { def main(args:Array[String]) { var expr1 = new Sum(new Num(1),new Pro
我想在下面运行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所谓的路径依赖类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读