如何使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我真的很高兴。只有当不同的封送员被声明为不同的类型时,这才有效。见上面的评论。如果您不同意,请提供运行代码。您的回答让我意识到我的解决方案走错了方向。。。谢谢你让我清醒过来;)@我真的很高兴。