我正在学习 Coursera 的 Scala 函数式编程课程,并发现工作表 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 发生了变化?
- 还有其他方法可以解决这个问题吗?
在 IntelliJ IDEA scala 工作表中,处理objects
与 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)
注意isPrime
可能是一个简单的def
,但我们选择将其定义为val
因为某些原因。
这样的代码很好,可以在任何正常的 scala 代码中工作,但在工作表中会失败,因为val
s 的定义是交叉引用的。
但是如果你将这些线包裹在某个对象中,例如
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)
}
会评估没问题的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)