Scala Intellij工作表及其定义的类
我在学习Scala函数式编程的Coursera课程时,发现了工作表repl的一个奇怪行为 在本课程中,带有以下代码的工作表应在右侧给出以下结果: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
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发生了变化
- 还有其他办法吗
对象内部的值的方式与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)
}