如何为超过 2 个案例确定隐含项的优先级
How to Prioritise Implicits for More than 2 cases
我最近在这里了解到了隐含优先级排序技术:Link
现在,我试图将其推广到隐式数 > 2 的情况。
从这里的这个答案,它说我可以通过创建特征层次结构来做到这一点:
这是一些我想优先考虑隐式的代码:
object Example extends App {
sealed trait Serializer[T] {
def serialize(seq: List[T]): String
}
implicit object StringSerializer extends Serializer[String] {
def serialize(seq: List[String]): String = seq.toString()
}
implicit object IntSerializer extends Serializer[Int] {
def serialize(seq: List[Int]): String = seq.toString()
}
implicit object FloatSerializer extends Serializer[Float] {
def serialize(seq: List[Float]): String = seq.toString()
}
case class Marker[T: Serializer](lst: Option[List[T]] = None)
Marker() // ambiguous implicit values: here...
}
在这种情况下,如何强加 Float > Int > String 的隐式优先级?
我的尝试如下:
trait A {
implicit object StringSerializer extends Serializer[String] {
def serialize(seq: List[String]): String = seq.toString
}
}
trait B extends A {
implicit object IntSerializer extends Serializer[Int] {
def serialize(seq: List[Int]): String = seq.toString
}
}
trait C extends B {
implicit object FloatSerializer extends Serializer[Float] {
def serialize(seq: List[Float]): String = seq.toString
}
}
但这没有用。查看代码,我发现我没有正确执行,但我不确定如何继续。
任何指导将不胜感激。
例如你可以做
val c = new C {}
import c._
Marker() //compiles
或
object c extends C
import c._
Marker() //compiles
或者使 C
成为一个对象而不是 trait
object C extends B {
implicit object FloatSerializer extends Serializer[Float] {
def serialize(seq: List[Float]): Value = ???
}
}
import C._
Marker() //compiles
如果您将 C
设为对象并将其重命名为 Serializer
(因此 C
成为特征 Serializer
的伴生对象),那么您将不必进行导入
object Serializer extends B {
implicit object FloatSerializer extends Serializer[Float] {
def serialize(seq: List[Float]): Value = ???
}
}
Marker() //compiles
Where does Scala look for implicits?
Where does Scala look for implicits?
我最近在这里了解到了隐含优先级排序技术:Link
现在,我试图将其推广到隐式数 > 2 的情况。
从这里的这个答案,它说我可以通过创建特征层次结构来做到这一点:
这是一些我想优先考虑隐式的代码:
object Example extends App {
sealed trait Serializer[T] {
def serialize(seq: List[T]): String
}
implicit object StringSerializer extends Serializer[String] {
def serialize(seq: List[String]): String = seq.toString()
}
implicit object IntSerializer extends Serializer[Int] {
def serialize(seq: List[Int]): String = seq.toString()
}
implicit object FloatSerializer extends Serializer[Float] {
def serialize(seq: List[Float]): String = seq.toString()
}
case class Marker[T: Serializer](lst: Option[List[T]] = None)
Marker() // ambiguous implicit values: here...
}
在这种情况下,如何强加 Float > Int > String 的隐式优先级?
我的尝试如下:
trait A {
implicit object StringSerializer extends Serializer[String] {
def serialize(seq: List[String]): String = seq.toString
}
}
trait B extends A {
implicit object IntSerializer extends Serializer[Int] {
def serialize(seq: List[Int]): String = seq.toString
}
}
trait C extends B {
implicit object FloatSerializer extends Serializer[Float] {
def serialize(seq: List[Float]): String = seq.toString
}
}
但这没有用。查看代码,我发现我没有正确执行,但我不确定如何继续。
任何指导将不胜感激。
例如你可以做
val c = new C {}
import c._
Marker() //compiles
或
object c extends C
import c._
Marker() //compiles
或者使 C
成为一个对象而不是 trait
object C extends B {
implicit object FloatSerializer extends Serializer[Float] {
def serialize(seq: List[Float]): Value = ???
}
}
import C._
Marker() //compiles
如果您将 C
设为对象并将其重命名为 Serializer
(因此 C
成为特征 Serializer
的伴生对象),那么您将不必进行导入
object Serializer extends B {
implicit object FloatSerializer extends Serializer[Float] {
def serialize(seq: List[Float]): Value = ???
}
}
Marker() //compiles
Where does Scala look for implicits?
Where does Scala look for implicits?