大小写 类 问题的隐式转换
Implicit Conversion of Case Classes Issues
我正在尝试将一种情况 class 隐式转换为另一种情况 class,但无法使代码正常工作。我的编辑器给我的错误是 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)
}
您的第二个解决方案(使用重复代码)有效,因为您明确地将 Seq[LegacyPhase]
转换为 Seq[Phase]
。
您可以通过在第一个 legacyToDashboardBrand
函数中为 LegacyPhase => 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 => DashboardBrand
转换函数,使用你的 LegacyPhase => Phase
转换函数。
注意:我不认为在隐式转换函数中查询数据库是个好主意。隐式转换本身相当 "magical" 并使您的代码更难理解,添加查询数据库等副作用只会使它更神奇。
我正在尝试将一种情况 class 隐式转换为另一种情况 class,但无法使代码正常工作。我的编辑器给我的错误是 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)
}
您的第二个解决方案(使用重复代码)有效,因为您明确地将 Seq[LegacyPhase]
转换为 Seq[Phase]
。
您可以通过在第一个 legacyToDashboardBrand
函数中为 LegacyPhase => 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 => DashboardBrand
转换函数,使用你的 LegacyPhase => Phase
转换函数。
注意:我不认为在隐式转换函数中查询数据库是个好主意。隐式转换本身相当 "magical" 并使您的代码更难理解,添加查询数据库等副作用只会使它更神奇。