如何使Scala列表的内容隐式可用?

时间:2017-03-13 10:38:41

标签: scala implicit

我有List个项目(在本例中为Spray Marshallers),我想在当前上下文中隐式提供这些项目。只是为了澄清:我不希望List本身隐式可用,而是列表中的每个元素。有人有诀窍吗?或者这实际上是不可能的,因为必须在编译时提供确切的含义?

2 个答案:

答案 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隐式参数