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

Luk*_*asz 7 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
}
Run Code Online (Sandbox Code Playgroud)

我得到的是

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
}
Run Code Online (Sandbox Code Playgroud)

只有在class进入后才能object获得与代码相同的结果.

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

Odo*_*ois 8

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

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

要实际看到你的vals和表达式,只需在任何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)
Run Code Online (Sandbox Code Playgroud)

请注意,这isPrime可能很简单def,但val出于某种原因我们选择定义它.

这样的代码很好并且可以在任何普通的scala代码中工作,但在工作表中会失败,因为vals定义是交叉引用的.

但是你把这些线包裹在像某些物体里面

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)
}
Run Code Online (Sandbox Code Playgroud)

它将被评估没有问题