我有List
个项目(在本例中为Spray Marshallers),我想在当前上下文中隐式提供这些项目。只是为了澄清:我不希望List
本身隐式可用,而是列表中的每个元素。有人有诀窍吗?或者这实际上是不可能的,因为必须在编译时提供确切的含义?
答案 0 :(得分:2)
在这种特殊情况下,如果我理解正确,您需要在上下文中提供所有特定的编组器,因此您需要隐式提供每个编组器。
您应该将它们放入一个对象中并将它们定义为隐式值。
object Protocol {
implicit val marshaller1: ...
implicit val marshaller2: ...
}
然后,通过导入Protocol
对象,您可以隐藏所有marshallers。
回答你的问题,是的,在编译时解决了implicits。因此,每当您需要使用特定的编组器时,隐式解析算法将查找特定编组器类型的value
。这就是为什么你不能从列表中得到它,让我们说,你不应该这样想。
答案 1 :(得分:0)
你无疑可以实现这一目标:
import shapeless._
import shapeless.ops.hlist.Selector
case class A()
case class B()
case class C()
val list : A :: B :: C :: HNil = A() :: B() :: C() :: HNil
def screamIfAccessible[T](implicit selector: Selector[A :: B :: C :: HNil ,T]) = {
selector(list) // Actually picks the T type element
// from the HList to work with
println("YAY!")
}
screamIfAccessible[A]
screamIfAccessible[B]
Shapeless - Generic programming with scala
代码中需要从列表中访问类型A的元素(或者在本例中为HList)的任何方法都需要具有Selector
隐式参数