Scala Intellij工作表及其定义的类

Scala Intellij工作表及其定义的类,scala,intellij-idea,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

我在学习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
}
只有在将
移动到
对象
中之后,我才得到与代码中相同的结果

  • 这是由Intellij引起的,还是Scala发生了变化
  • 还有其他办法吗

在IntelliJ IDEA scala工作表中,处理
对象内部的值的方式与Eclipse/scala IDE不同

对象内的值不会在线性序列模式下求值,而是将其视为普通scala对象。在明确使用之前,你几乎看不到关于它的信息

要实际查看
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)

评估时不会出现问题

这是IntelliJ工作表行为,有时非常方便。只需将
val
s和表达式写在objects@Odomontois好的,它起作用了。但我仍然不明白他的观点是什么?有些
val
定义有时不应该按顺序进行评估。
lazy val
s之间可能存在复杂的依赖关系,或者在
.toString
阶段引发异常,因为
对象
尚未完全初始化。所以在这个想法中,您可以将这些讨厌的东西包装到对象中,而在Eclipse中,您没有其他选项,只能将它们提取到单独的.scala中source@Odomontois如果你愿意,你可以把你的评论合并成一个答案。我会接受的。
  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)
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)
}