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

How do I make the contents of a Scala List implicitly available?

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

在这种特殊情况下,如果我理解正确的话,您需要在上下文中提供所有特定编组器,因此您需要隐式提供每个编组器。

您应该将它们放入对象中并将它们定义为隐式值。

object Protocol {
  implicit val marshaller1: ...
  implicit val marshaller2: ...
}

然后,通过导入 Protocol 对象,您可以让所有编组器隐式可用。

为了回答您的问题,是的,隐式在编译时解析。因此,无论何时您需要使用特定的编组器,隐式解析算法都会查找特定编组器类型的 value。这就是为什么你不能从列表中获取它,比方说,你不应该想要这样。

你当然可以用 shapeless 实现这个:

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

代码中任何需要从列表(或在本例中为 HList)访问类型 A 的元素的方法都需要具有 Selector 隐式参数