gpt4 book ai didi

Scala酸洗和类型参数

转载 作者:行者123 更新时间:2023-12-04 10:25:38 26 4
gpt4 key购买 nike

我正在使用 Scala Pickling ,Scala 的自动序列化框架。
根据author's slides , 任何类型 T只要有隐式 Pickler[T] 就可以腌制在适用范围。
在这里,我假设她的意思是 scala.tools.nsc.io.Pickler .
但是,以下内容无法编译:

import scala.pickling._
import scala.pickling.binary._
import scala.tools.nsc.io.Pickler

object Foo {
def bar[T: Pickler](t: T) = t.pickle
}

错误是:
[error] exception during macro expansion:
[error] scala.ScalaReflectionException: type T is not a class
[error] at scala.reflect.api.Symbols$SymbolApi$class.asClass(Symbols.scala:323)
[error] at scala.reflect.internal.Symbols$SymbolContextApiImpl.asClass(Symbols.scala:73)
[error] at scala.pickling.PickleMacros$class.pickleInto(Macros.scala:381)
[error] at scala.pickling.Compat$$anon$17.pickleInto(Compat.scala:33)
[error] at scala.pickling.Compat$.PickleMacros_pickleInto(Compat.scala:34)

我正在使用带有 scala-pickling 0.8-SNAPSHOT 的 Scala 2.10.2。

这是错误还是用户错误?

编辑 1: scala.pickling.SPickler 都出现相同的错误和 scala.pickling.DPickler .

编辑 2:看起来这是一个错误: https://github.com/scala/pickling/issues/31

最佳答案

是的,正如安迪指出的那样:

you need either a scala.pickling.SPickler or a scala.pickling.DPickler (static and dynamic, respectively) in order to pickle a particular type.



那些都已经进入 scala.pickling包,因此只需在您的通用方法签名中使用它们就足够了。

您可以添加 SPickler 是绝对正确的上下文绑定(bind)到您的通用方法。您需要的唯一额外的东西(诚然它有点难看,我们正在考虑删除它)是添加一个 FastTypeTag上下文绑定(bind)也是如此。 (这对于酸洗框架来说是必要的,以了解它正在尝试酸洗什么类型,因为它以不同的方式处理基元,例如。)

这是您提供通用酸洗/取消酸洗方法所需要做的事情:

请注意,对于 unbar方法,您需要提供 Unpickler上下文绑定(bind)而不是 SPickler上下文绑定(bind)。
import scala.pickling._
import binary._

object Foo {
def bar[T: SPickler: FastTypeTag](t: T) = t.pickle
def unbar[T: Unpickler: FastTypeTag](bytes: Array[Byte]) = bytes.unpickle[T]
}

在 REPL 中测试这个,你会得到:
scala> Foo.bar(42)
res0: scala.pickling.binary.BinaryPickle =
BinaryPickle([0,0,0,9,115,99,97,108,97,46,73,110,116,0,0,0,42])

scala> Foo.unbar[Int](res0.value)
res1: Int = 42

关于Scala酸洗和类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18725699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com