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 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)
它将被评估没有问题
| 归档时间: |
|
| 查看次数: |
1048 次 |
| 最近记录: |