Scala:具有嵌套大小写的通用函数 类
Scala: generic function with nested case classes
我想做一个通用函数,能够根据它们的一个共同的 "sub" 参数对不同的嵌套案例 class 进行排序。
目前我这样做了:
sealed trait SortableByGeoPoint {
val geographicPoint: Int
}
case class A(id: Int, geographicPoint: Int) extends SortableByGeoPoint
case class B(image: String, geographicPoint: Int) extends SortableByGeoPoint
case class C(a: A, other: String)
case class D(b: B, other: Int)
def sortByGeoPoint(sequence: Seq[SortableByGeoPoint]): Seq[SortableByGeoPoint] = sequence.sortBy(_.geographicPoint)
对 class A 或 class B 的序列排序效果很好,但我想让它对 class C 或 class C 或D(包含一个 SortableByGeoPoint 子class)我怎样才能完成这个?
我看了看 shapeless 但没有找到方法来做到这一点,但是有任何方法可以做到(知道我稍后会添加其他 classes,比如 class C或 D),将是完美的。
我认为您缺少某种形式的类型约束。编译示例代码最直接的方法是:
case class C(a: A, other: String) extends SortableByGeoPoint {
val geographicPoint: Int = a.geographicPoint
}
case class D(b: B, other: Int) extends SortableByGeoPoint {
val geographicPoint: Int = b.geographicPoint
}
这可能符合也可能不符合您的要求。那么,让我们再做一个:
case class Z[T](b: SortableByGeoPoint, other: T)
def sortByGeoPoint2(sequence: Seq[Z]): Seq[Z] = sequence.sortBy(_.b.geographicPoint)
事实上,我可以想出许多其他方法来实现同样的结果。不胜枚举。如果您能说明一些其他要求,我可能会找到更合适的解决方案。
我想做一个通用函数,能够根据它们的一个共同的 "sub" 参数对不同的嵌套案例 class 进行排序。
目前我这样做了:
sealed trait SortableByGeoPoint {
val geographicPoint: Int
}
case class A(id: Int, geographicPoint: Int) extends SortableByGeoPoint
case class B(image: String, geographicPoint: Int) extends SortableByGeoPoint
case class C(a: A, other: String)
case class D(b: B, other: Int)
def sortByGeoPoint(sequence: Seq[SortableByGeoPoint]): Seq[SortableByGeoPoint] = sequence.sortBy(_.geographicPoint)
对 class A 或 class B 的序列排序效果很好,但我想让它对 class C 或 class C 或D(包含一个 SortableByGeoPoint 子class)我怎样才能完成这个?
我看了看 shapeless 但没有找到方法来做到这一点,但是有任何方法可以做到(知道我稍后会添加其他 classes,比如 class C或 D),将是完美的。
我认为您缺少某种形式的类型约束。编译示例代码最直接的方法是:
case class C(a: A, other: String) extends SortableByGeoPoint {
val geographicPoint: Int = a.geographicPoint
}
case class D(b: B, other: Int) extends SortableByGeoPoint {
val geographicPoint: Int = b.geographicPoint
}
这可能符合也可能不符合您的要求。那么,让我们再做一个:
case class Z[T](b: SortableByGeoPoint, other: T)
def sortByGeoPoint2(sequence: Seq[Z]): Seq[Z] = sequence.sortBy(_.b.geographicPoint)
事实上,我可以想出许多其他方法来实现同样的结果。不胜枚举。如果您能说明一些其他要求,我可能会找到更合适的解决方案。