【问题标题】:Implicit Conversion of Case Classes Issues案例类问题的隐式转换
【发布时间】:2015-09-14 20:18:24
【问题描述】:

我正在尝试将一个案例类隐式转换为另一个案例类,但无法使代码正常工作。我的编辑告诉我 Seq[LegacyPhase] 没有转换为预期的 Seq[Phase] 的错误。谁能指出我的方向?提前致谢!

implicit def legacyToDashboardBrand(brand: LegacyDashboardBrand)(implicit session: Session): DashboardBrand = {
  val phaseSeq: Seq[Phase] = (for { phaseDataset <- dashboardPhasesQ if phaseDataset.brandId === brand.id
  } yield phaseDataset).list.toSeq
  DashboardBrand(id = brand.id, projectId = brand.projectId, name = brand.name, currentPhase = brand.currentPhase, phases = phaseSeq)
}

implicit def legacyToDashboardPhase(phase: LegacyPhase): Phase = {
  Phase(id = phase.id, brandId = phase.brandId, title = phase.title, steps = Seq())
}

编辑:如果我在第一个隐式转换定义中执行第二个隐式转换行,它会起作用。

implicit def legacyToDashboardBrand(brand: LegacyDashboardBrand)(implicit session: Session): DashboardBrand = {
  val legacyPhaseSeq = (for { 
    phaseDataset <- dashboardPhasesQ if phaseDataset.brandId === brand.id
  } yield phaseDataset).list.toSeq
  val phaseSeq: Seq[Phase] = legacyPhaseSeq.map(phase => 
    Phase(id = phase.id, brandId = phase.brandId, title = phase.title, steps = Seq())
  )

  DashboardBrand(id = brand.id, projectId = brand.projectId, name = brand.name, currentPhase = brand.currentPhase, phases = phaseSeq)
}

【问题讨论】:

  • 你能告诉我们确切的错误吗? dashboardPhasesQ 是什么?
  • 嘿,彼得。 dashboardPhasesQ 是一个表查询。 val dashboardPhasesQ = TableQuery[LegacyPhaseTable]

标签: scala implicit-conversion


【解决方案1】:

您的第二个解决方案(使用重复的代码)有效,因为您将Seq[LegacyPhase] 显式转换为Seq[Phase]

您可以通过在您的第一个legacyToDashboardBrand 函数中为您的LegacyPhase =&gt; Phase 转换函数添加一个隐式参数来获得相同的结果:

implicit def legacyToDashboardBrand(
  brand: LegacyDashboardBrand
)(implicit 
  session: Session,
  phaseConv: LegacyPhase => Phase
): DashboardBrand = {
  val phaseSeq: Seq[Phase] = (for { 
    phaseDataset <- dashboardPhasesQ if phaseDataset.brandId === brand.id
  } yield phaseDataset).list.map(phaseConv).toSeq
  DashboardBrand(
    id = brand.id, projectId = brand.projectId, name = brand.name,
    currentPhase = brand.currentPhase, phases = phaseSeq
  )
}

这样你的LegacyDashboardBrand =&gt; DashboardBrand 转换函数,使用你的LegacyPhase =&gt; Phase 转换函数。

注意:我认为在隐式转换函数中查询数据库不是一个好主意。隐式转换本身就非常“神奇”,会让你的代码更难理解,添加查询数据库等副作用只会让它变得更神奇。

【讨论】:

  • 感谢您的尝试,彼得,但产生的结果与以前相同......它仍然没有转换它。
  • 我们可以使用隐式传递的phaseConv来映射LegacyPhases,见更新。
  • 谢谢,彼得,现在可以了。知道为什么它在第一种情况下不起作用吗?相信我,我明白你的隐含意义来自哪里
  • 我在范围内有一个隐式转换LegacyPhase =&gt; Phase,而不是List[LegacyPhase] =&gt; List[Phase]。我们也可以添加这样的转换,但如果我们在这里只使用该转换,我们可以只使用map(phaseConv)
猜你喜欢
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2019-04-01
  • 1970-01-01
  • 2013-10-01
  • 2015-08-30
相关资源
最近更新 更多