在本地Scala REPL中,无需关键字lazy
即可定义流和惰性列表。
scala> val fibo: LazyList[BigInt] = (0: BigInt) #:: (1: BigInt) #:: fibo.zip(fibo.tail).map { n => n._1 + n._2 }
fibo: LazyList[BigInt] = LazyList(<not computed>)
scala> fibo(100)
res17: BigInt = 354224848179261915075
scala> val prime: LazyList[Int] = 2 #:: LazyList.from(3).filter(i => prime.takeWhile {
| j => j * j <= i
| }.forall {
| k => i % k != 0
| })
prime: LazyList[Int] = LazyList(<not computed>)
scala> prime(100)
res18: Int = 547
这与Stream
的工作方式几乎相同,在Scastie中也是如此。它也应该在IntelliJ项目中工作,对吧?
@Test def testGCDConsecutivePrimeNumbers(): Unit = {
val prime: LazyList[Int] = 2 #:: LazyList.from(3).filter(i => prime.takeWhile {
j => j * j <= i
}.forall {
k => i % k != 0
})
for (n <- 1 to 100) {
assertEquals(1, gcd(prime(n), prime(n + 1)))
}
}
@Test def testGCDConsecutiveEvenFibonacciNumbers(): Unit = {
val fibo: LazyList[Int] = 0 #:: 1 #:: fibo.zip(fibo.tail).map(n => n._1 + n._2)
for (i <- 0 to 42 by 3) {
assertEquals(2, gcd(fibo(i), fibo(i + 3)))
}
}
除非不是。
错误:(21,67)前向引用扩展了值
prime
的定义
val prime: LazyList[Int] = 2 #:: LazyList.from(3).filter(i => prime.takeWhile {
错误:(32,43)前向引用扩展了值
fibo
的定义
val fibo: LazyList[Int] = 0 #:: 1 #:: fibo.zip(fibo.tail).map(n => n._1 + n._2)
将它们标记为惰性可以清除错误。
我了解REPL中的某些功能会有所不同,但我不明白为什么这会是其中之一。而且我可能在这里缺少一些细微之处,但是为什么在REPL中没有省略“ lazy
”会导致前向引用错误。通常,什么时候需要显式指定懒惰,为什么?
不是直接在REPL中以不同方式工作的“其中之一”,而是因为它们。在失败的代码中,prime
和fibo
是局部变量。当您直接在REPL中定义它们时,它们是匿名对象的属性,即它生成类似