2

我有两个用例 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,上面的原型展示了带有执行器的案例类,等我弄清楚生成器的编写方法后,我会将逻辑移到表达式树之外。

可能相关

如何在scala中实现惰性序列(可迭代)?

流 vs 视图 vs 迭代器

在 Scala 中功能性地处理数据库游标

将 SQL ResultSet 视为 Scala 流

思路:

在这种情况下,我觉得为迭代器建模可能是我最好的选择,但我还没有研究它们如何适应表达式。但是库中迭代器的特征和模板是否可以与 for 表达式很好地互操作,即使可以,它们是否会涵盖流用例?

我应该用 Java 编写 io 代码吗(现在拍我 :~() 吗?

4

0 回答 0