我有两个用例1)遍历数据库游标2)实现类似于Python的Scrapy的数据抓取框架。我只想用for循环和yield来编写东西。
我的两个问题是:
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]
SelectMultiple
P.s。,上面的原型显示了带有执行器的case类,在我弄清楚如何编写生成器之后,我将把逻辑移到表达式树的外部。
可能相关
How to implement lazy sequence (iterable) in scala?
Functionally processing a database cursor in Scala
Treating an SQL ResultSet like a Scala Stream
思路:
我觉得在这种情况下建模Iterator可能是我最好的选择,但我还没有考虑过它们如何适应表达式。但是库中迭代器的特征和模板是否会与for表达式相互影响,即使它们存在,它们是否会覆盖流式用例?
我应该用Java编写io代码(现在拍我:〜()?