2015-11-10 9 views
5

私はScalaの関数型プログラミングに関するCourseraコースに従っており、ワークシートreplの奇妙な振る舞いに沿っています。途中で Intellijワークシートとそれで定義されているクラス

右に次のような結果与えるべき次のコードでのワークシート:私は何を得る

object rationals { 
val x = new Rational(1, 2)    > x : Rational = [email protected]<hash_code> 
    x.numer        > res0: Int = 1 
    y. denom        > res1: Int = 2 
} 

class Rational(x: Int, y: Int) { 
    def numer = x 
    def denom = y 
} 

object rationals {      > defined module rationals 
val x = new Rational(1, 2)    
    x.numer        
    y. denom        
} 

class Rational(x: Int, y: Int) {  > defined class Rational 
    def numer = x 
    def denom = y 
} 

だけ私が得たobjectclassを移動した後であるがコードと同じ結果になります。

  • これはIntellijによって引き起こされたのですか、Scalaに変更がありましたか?
  • 他の方法がありますか?
+3

で評価されます

object Primes { val primes = 2l #:: Stream.from(3, 2).map(_.toLong).filter(isPrime) val isPrime: Long => Boolean = n => primes.takeWhile(p => p * p <= n).forall(n % _ != 0) } 

のようないくつかのオブジェクト内の、このような行を折り返します。オブジェクトの外側に 'val'sとエクスプレッションを書くだけです。 – Odomontois

+0

@Odomontois Ok、それは動作します。しかし、私はまだ彼のポイントが何かを見ていないのですか? – Lukasz

+0

いくつかの 'val'の定義は時々順序付けられた方法で評価されるべきではありません。 'オブジェクト'がまだ完全に初期化されていないため、 'lazy val'または' .toString'ステージでスローされる例外の間に複雑な依存関係が存在する可能性があります。 IDEAではオブジェクトのような厄介なものをラップすることができます。Eclipseでは別のオプションがありません。別の.scalaソースで抽出してください。 – Odomontois

答えて

7

IntelliJ IDEA scalaワークシートでは、objects内の値がEclipse/Scala IDEと異なる方法で処理されます。

オブジェクト内の値は、線形シーケンスモードで評価されず、代わりに通常のスカラーオブジェクトとして扱われます。明示的に使用するまで、それについての情報はほとんど見えません。実際にあなたのval Sや表現を表示するには

単に任意のオブジェクト\クラス外でそれらを定義したり、評価し

この動作は、いくつかのケースでは救世主である可能性があります。その定義があるとします。

val primes = 2l #:: Stream.from(3, 2).map(_.toLong).filter(isPrime) 

    val isPrime: Long => Boolean = 
    n => primes.takeWhile(p => p * p <= n).forall(n % _ != 0) 

isPrimeはシンプルdefをcoulbe、しかし、我々はいくつかの理由でvalとして定義することを選択することに注意してください。

このようなコードは通常のスカラーコードではうまく動作しますが、ワークシートでは失敗します。valの定義は相互参照しているためです。

しかし、それは、あなたはそれこれは、時には非常に便利であるIntelliJのワークシートの動作です問題はない

関連する問題