2012-11-10 4 views
4

아래의 클래스 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 

라인

은 컴파일 타임 오류를 일으키는

: '을 (를) 찾을 수 없습니다 : 개체 EXPR를'. Expr 클래스를 어떻게 가져올 수 있습니까?

+0

이 정의는 다른 파일에서 가져온 것입니까? 그들은 같은 패키지에 있습니까? 세부 사항을 부탁드립니다. –

+0

@Aaron Novstrup ive는 코드의 원래 출처를 보여주기 위해 제 질문을 업데이트했습니다. – user701254

+0

@ user701254 해당 링크의 코드는 중괄호를 제외한 마이너스 코드와 같습니다. – Brian

답변

8

당신 인스턴스의 수입 회원 수 있습니다. 그래서 코드는 다음과 같습니다

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 Prod(new Num(2), new Num(3))) 
     print(expr1) 
    } 
} 

간단한 예는이 아닌 경우 회원을 가져올 수 없습니다 이유를 설명 : 당신이 import A.Print가, 어떤 값이 x

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

을 준수 할 것입니다 수 있다면? 이제 우리가 할 경우 :

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

이것은 하나의 이유입니다. new A(5).Print != new A(5).Print이 평등 일뿐만 아니라 유형이 val (a1, a2) = (new A(5), new A(5)); implicitly[a1.Print <:< a2.Print] 인 다른 이유는 컴파일되지 않습니다. 이것은 스칼라가 경로 종속 형식 인을 호출하는 것입니다.

1

사례 클래스를 추상 클래스 밖으로 이동하면 컴파일됩니다. 이 경우에도 동일한 범위에 있으므로 가져올 항목이 없습니다.

동일한 패키지에 MainExpr이 정의되어 있기 때문에 여기에 import 오류가 적용되지 않습니다. 즉 기본 패키지

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) 
} 

이주는 실행 :

scala>Main.main(Array[String]()) 
Sum(Num(1),Prod(Num(2),Num(3))) 
+1

최상위 수준 정의가 허용되지 않아 작동하지 않습니다. 그것들을'객체 Expr' 또는 그것과 비슷한 것으로 싸십시오. – sschaef

관련 문제