Intellij工作表和在其中定义的类

时间:2015-11-10 12:43:12

标签: scala intellij-idea

我正在关注Scala中的函数式编程Coursera课程,并且出现了工作表repl的奇怪行为。

在课程中,带有以下代码的工作表应在右侧给出以下结果:

object rationals {
val x = new Rational(1, 2)              > x : Rational = Rational@<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
}

只有在将class移动到object后,才能获得与代码相同的结果。

  • 这是由Intellij引起的,还是Scala中有变化?
  • 还有其他解决方法吗?

1 个答案:

答案 0 :(得分:7)

在IntelliJ IDEA中,scala工作表处理objects内的值与Eclipse / Scala IDE不同。

对象内的值不以线性序列模式计算,而是被视为普通的scala对象。在明确使用之前,您几乎看不到有关它的信息。

要实际看到您的val和表达式只是在任何object \ class

之外定义或评估它们

在某些情况下,这种行为可能是一种救世主。假设您有这些定义。

  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,但出于某种原因,我们选择将其定义为val

这样的代码非常好用于任何普通的scala代码,但在工作表中会失败,因为val的定义是交叉引用的。

但是你将这些行包装在像

这样的对象中
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)
}

将毫无问题地进行评估