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

如何使Scala列表的内容隐式可用?,scala,implicit,Scala,Implicit,我有一个列表(在本例中是Spray Marshallers),我想在当前上下文中隐式地使用它。澄清一下:我不希望列表本身可以隐式使用,而是希望列表中的每个元素都可以隐式使用。有人有办法做到这一点吗?或者这实际上是不可能的,因为确切的隐式必须在编译时可用?在这种特殊情况下,如果我理解正确,您需要在上下文中提供所有特定的封送拆收器,因此您需要隐式提供每一个封送拆收器 您应该将它们放入对象中,并将它们定义为隐式值 object Protocol { implicit val marshaller1

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

在这种特殊情况下,如果我理解正确,您需要在上下文中提供所有特定的封送拆收器,因此您需要隐式提供每一个封送拆收器

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

object Protocol {
  implicit val marshaller1: ...
  implicit val marshaller2: ...
}
然后,通过导入
协议
对象,您将使所有封送拆收器隐式可用


为了回答您的问题,是的,隐式在编译时被解析。因此,每当您需要使用特定的封送拆收器时,隐式解析算法将查找特定封送拆收器类型的
值。这就是为什么您无法从列表中获取它,并且您不应该希望这样做。

在这种情况下,如果我理解正确,您需要在上下文中提供所有特定的封送拆收器,因此您需要隐式地提供每一个封送拆收器

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

object Protocol {
  implicit val marshaller1: ...
  implicit val marshaller2: ...
}
然后,通过导入
协议
对象,您将使所有封送拆收器隐式可用


为了回答您的问题,是的,隐式在编译时被解析。因此,每当您需要使用特定的封送拆收器时,隐式解析算法将查找特定封送拆收器类型的
值。这就是为什么你不能从列表中得到它的原因,比方说,你不应该希望这样做。

你当然可以用Shapess实现这一点:

导入无形状_
导入shapeless.ops.hlist.Selector
案件类别A()
案件B类()
案件类别C()
val列表:A::B::C::HNil=A()::B()::C()::HNil
def CREANIFAccessable[T](隐式选择器:选择器[A::B::C::HNil,T])={
选择器(列表)//实际拾取T类型元素
//从HList开始与您合作
println(“耶!”)
}
如果可能的话[A]
如果可行[B]


代码中任何需要从列表(或在本例中为HList)中访问类型A元素的方法都需要使用
选择器
隐式参数您当然可以使用shapeless实现这一点:

导入无形状_
导入shapeless.ops.hlist.Selector
案件类别A()
案件B类()
案件类别C()
val列表:A::B::C::HNil=A()::B()::C()::HNil
def CREANIFAccessable[T](隐式选择器:选择器[A::B::C::HNil,T])={
选择器(列表)//实际拾取T类型元素
//从HList开始与您合作
println(“耶!”)
}
如果可能的话[A]
如果可行[B]


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

您是否有使用它的位置/方式的示例代码?对于每种类型,隐式搜索只能选择一个实例。如果有多个实例可用,而隐式搜索无法选择,您将得到
错误:不明确的隐式值
列表[T]
中的每个元素都有类型
T
。那么这将如何解决呢?更多的上下文:我试图创建一个指令作为库的一部分,允许用户拥有多个版本的HTTP API。此指令将使正确的封送拆收器进入范围。然而,该解决方案结合了编译时逻辑和运行时逻辑。我现在选择了一个不同的路径:一个自定义的
complete
指令,它取代了原来的指令,并将一个隐式的封送拆收器列表作为参数。此指令选择正确的封送拆收器并创建响应。工作起来很有魅力!谢谢你的贡献!您是否有在何处/如何使用它的示例代码?对于每种类型,隐式搜索只能选择一个实例。如果有多个实例可用,而隐式搜索无法选择,您将得到
错误:不明确的隐式值
列表[T]
中的每个元素都有类型
T
。那么这将如何解决呢?更多的上下文:我试图创建一个指令作为库的一部分,允许用户拥有多个版本的HTTP API。此指令将使正确的封送拆收器进入范围。然而,该解决方案结合了编译时逻辑和运行时逻辑。我现在选择了一个不同的路径:一个自定义的
complete
指令,它取代了原来的指令,并将一个隐式的封送拆收器列表作为参数。此指令选择正确的封送拆收器并创建响应。工作起来很有魅力!谢谢你的贡献!只有当不同的封送拆收器被声明为不同的类型时,这才有效。见上面的评论。如果您不同意,请提供运行代码。您的回答让我意识到我的解决方案走错了方向。。。谢谢你让我清醒过来;)@Jan Pieter我真的很高兴。只有当不同的封送员被声明为不同的类型时,这才有效。见上面的评论。如果您不同意,请提供运行代码。您的回答让我意识到我的解决方案走错了方向。。。谢谢你让我清醒过来;)@我真的很高兴。