scala - 在 Scala 中,什么时候需要指定惰性?
问题描述
在本地 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 中有些事情的工作方式不同,但我不明白为什么这是其中之一。而且我可能在这里遗漏了一些微妙之处,但是为什么lazy
在 REPL 中省略 " " 会导致前向引用错误。一般来说,什么时候需要明确指定惰性,为什么?
解决方案
它不是直接“在 REPL 中以不同方式工作”的“其中之一”,而是因为它们。在失败的代码中,prime
和fibo
是局部变量。当您直接在 REPL 中定义它们时,它们是匿名对象的属性,即它会生成类似
object Line1 {
val fibo = ...
}
import Line1.fibo
如果您查看规范,前向引用限制仅适用于局部变量:
它可以构成对象或类定义的一部分,也可以是块的本地...
但是,块中的前向引用存在限制
推荐阅读
- reactjs - 从使用 fetch 更改为 fs.readFile 或 require
- windows - Gvim.exe 无法使用“--remote-tab-silent”参数打开其路径中包含重音字符的文件
- c# - 将多个列与 lambda 表达式相关联
- python - 如何修复 {"message": "请求的 URL 不允许该方法。" } 对于我的发布方法?
- java - hazelcast 3.5:配置异常
- c# - 如何扩展/扩展 ItemAdd 以处理超过 16 封邮件?
- asp.net-core - EF Core 批量更新(更新范围)增加现有列值
- amazon-web-services - 无法在 EMR spark 集群中运行 python 作业
- python - asyncio.loop.time() 可以与 datetime.datetime.now() 相提并论吗?
- php - trying to downloadable excel between two dates from mysql