我有两个用例 1)遍历数据库游标 2)实现类似于 Python 的 Scrapy 的数据抓取框架。我只是想使用 for 循环和产量来写东西。
我的两个问题是:
1)重要的一点:我如何为 IO 实现生成器,以便它一次检索一个元素,它看起来有点像 Python 生成器。Scala Stream 示例专注于数学问题,而“我如何实现 Python 生成器”的示例并没有详细说明:D
2) 生成器的签名将实现为仅返回单个实体和流的函数。如何在不必将返回显式定义为单值序列的情况下执行此操作?
示例(来自我的原型):
abstract class Expression
case class Visit(val url: String) extends Expression
case class SelectMultiple(selector: String,
List[(Element)=>ExpressionResult]) extends Expression
访问很可能会返回单个结果,而SelectMultiple
会吐出 Urls,并提取要写入磁盘的项目。
和:
abstract class ExpressionResult
case class ExtractedEntity(val entity: Entity) extends ExpressionResult
case class ExtractedRequest(val url: String) extends ExpressionResult
case class Continue() extends ExpressionResult
case class Ignore() extends ExpressionResult
我有 :
case class Visit(url:String, andDo: ScrapeExpression) extends ScrapeExpression{
override def execute : ExpressionResult = {
val doc = Jsoup.connect(url).get()
andDo.element = doc
println( "visiting")
andDo.execute
Continue()
}
}
但我必须将执行的签名更改为Seq[ExpressionResult]
forSelectMultiple
Ps,上面的原型展示了带有执行器的案例类,等我弄清楚生成器的编写方法后,我会将逻辑移到表达式树之外。
可能相关
思路:
在这种情况下,我觉得为迭代器建模可能是我最好的选择,但我还没有研究它们如何适应表达式。但是库中迭代器的特征和模板是否可以与 for 表达式很好地互操作,即使可以,它们是否会涵盖流用例?
我应该用 Java 编写 io 代码吗(现在拍我 :~() 吗?