2014-02-23 5 views
0

저는 스칼라를 처음 접했고 사례 클래스 사용 예제 인 http://docs.scala-lang.org/tutorials/scala-for-java-programmers.html이 튜토리얼을 따르고 있습니다.사례가있는 추상 클래스의 스칼라 실행

나는 아래의 예를 실행하려고했다 :

package classes 

abstract class Tree 
case class Sum(l: Tree, r: Tree) extends Tree 
case class Var(n: String) extends Tree 
case class Const(v: Int) extends Tree { 

    type Environment = String => Int 

    def eval(t: Tree, env: Environment): Int = t match { 
     case Sum(l, r) => eval(l, env) + eval(r, env) 
     case Var(n) => env(n) 
     case Const(v) => v 
    } 
} 

을하지만 것은 내가 그것을 실행할 수 없습니다이다 나는 이유는 그것 때문에 내가 거기 주요 방법을 추가 할 수 있다는 것입니다 의심 클래스가 아니라 객체입니다. 그래서 나는 거기에 주요 방법으로 객체를 생성 :

package classes 

object TreeOperations { 
    type Environment = String => Int //XXX: cannot I import it somehow? 

    def main(args: Array[String]) {  
     // evaluating (x+x)+(7+y) expression 
     val exp: Tree = Sum(Sum(Var("x"), Var("x")),Sum(Const(7), Var("y"))) 
     val env: Environment = { case "x" => 5 case "y" => 7} // x := 5, y := 7 
     println("Expression: " + exp) 
     println("Evaluation with x=5, y=7: " + eval(exp, env)) //XXX no eval here 
    } 
} 

그러나 나는 두 가지 발견 :

  1. 나는 그것이 differnent 클래스 (나는 나무를 시도하기 때문에 환경 입력에 대한 액세스를 얻을 수 있습니다. 환경 그러나 그것은 작동하지 않았다).

  2. eval (...)에 대한 액세스 권한을 얻을 수 없습니다 (동일한 시도).

그래서 나는 이러한 어려움을 해결하는 가장 좋은 방법이 무엇인지 알고 싶었습니다.

미리 감사드립니다.

답변

2

튜토리얼에서 유형 선언과 eval 메소드가 케이스 클래스 Const 내에 정의되어야한다고 말하는 곳이 어디인지 알 수 없습니다. 이 클래스를 케이스 클래스 외부에 넣으 시겠지만 같은 객체 또는 가져 오는 객체에 다음과 같이 입력하십시오.

모든 정의를 하나 또는 여러 파일에 넣으십시오.이 경우 필요한 경우 선언을 가져와야합니다.) :

TreeOperations 파일에서
package classes 

abstract class Tree 
case class Sum(l: Tree, r: Tree) extends Tree 
case class Var(n: String) extends Tree 
case class Const(v: Int) extends Tree 

, 당신은 할 것이다 다음

package classes 

import Tree._ 

object TreeOperations { 
    type Environment = String => Int //XXX: cannot I import it somehow? 

    def eval(t: Tree, env: Environment): Int = t match { 
    case Sum(l, r) => eval(l, env) + eval(r, env) 
    case Var(n) => env(n) 
    case Const(v) => v 
    } 

    def main(args: Array[String]) {  
    // evaluating (x+x)+(7+y) expression 
    val exp: Tree = Sum(Sum(Var("x"), Var("x")),Sum(Const(7), Var("y"))) 
    val env: Environment = { case "x" => 5 case "y" => 7} // x := 5, y := 7 
    println("Expression: " + exp) 
    println("Evaluation with x=5, y=7: " + eval(exp, env)) //XXX no eval here 
    } 
} 
+0

하나 개의 클래스/파일 당 객체, 즉 하나 Tree.scala 및 주요 방법으로 다른 TreeOperations.scala이 가능, 내가하고 싶은입니까? –

+0

예, Tree, Sum, ...과 같은 관련 유형을 가져올 수 있습니다. 'TreeOperations' 객체는'eval' 작업과 환경 유형 정의를 포함해야합니다. 나는 내 대답을 업데이트하고있다. – Peter

+0

정말 고마워! 고마워! 나는 다른 클래스를 객체 내부에서 접근 할 수 있도록 가져와야한다는 것을 알지 못했다. 이 방법으로 Tree 클래스의 모든 것을 정의한 다음 주 메서드에 대해서만 개체를 ​​사용할 수 있습니다.이 메서드는 정확히 내가 원했던 것입니다. 당신의 도움을 주셔서 대단히 감사합니다. –

-1

나는이처럼 써서 :

package classes 

abstract class Tree 

case class Sum(l: Tree, r: Tree) extends Tree 

case class Var(n: String) extends Tree 

case class Const(v: Int) extends Tree { 

    type Environment = String => Int 

    def eval(t: Tree, env: Environment): Int = t match { 
     case Sum(l, r) => eval(l, env) + eval(r, env) 
     case Var(n) => env(n) 
     case Const(v) => v 
    } 
} 

object AppMain extends App { 
    // evaluating (x+x)+(7+y) expression 
    val exp: Tree = Sum(Sum(Var("x"), Var("x")),Sum(Const(7), Var("y"))) 
    val env: Environment = { case "x" => 5 case "y" => 7} // x := 5, y := 7 
    println("Expression: " + exp) 
    println("Evaluation with x=5, y=7: " + eval(exp, env)) //XXX no eval here 
} 

scala-api docs for App

+0

내가 원하는 것은 파일 당 하나의 클래스/개체, 즉 하나의 Tree.scala와 주 방법을 사용하는 또 다른 TreeOperations.scala가 가능합니까? –

+0

그리고 한 가지 더 :이 방법을 사용하면 AppMain 객체의 환경 유형에 액세스 할 수 없다는 것을 이미 확인했습니다. 그리고 환경 유형을 클래스에서 선언하려고 시도했지만 작동하지 않았습니다. –