我正在关注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
后,才能获得与代码相同的结果。
答案 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)
}
将毫无问题地进行评估