小编Jar*_*zga的帖子

如何使用scala反射2.10检查案例类的哪些参数具有默认值

我的任务是找到案例类的参数名称,其中有默认值.

在2.9我从scalap使用ScalaSigParser并做了类似的事情:

(...)
case x: MethodSymbol if x.name.startsWith("init$default$") => (...)
(...)
Run Code Online (Sandbox Code Playgroud)

我希望2.10中的反思会让我更容易获得这种信息.

最后我想编写一个宏,我将在case类的伴随对象中包含它,它将自动创建一个用于该case类的序列化/反序列化的代码.为此,我需要知道哪些参数具有默认值.

reflection macros scala

8
推荐指数
1
解决办法
1302
查看次数

是否可以推迟宏扩展,直到抽象类型绑定到特定类型

我可能使用了不正确的术语,但这里是我想要实现的示例.可以说我有以下宏:

def generateField[T]: AnyRef =
  macro generateFieldImpl[T]

def generateFieldImpl[T: c.AbsTypeTag](c: Context): c.Expr[AnyRef] = {
/**
 * here I'm looking at the type T by reflection to see now many members it has
 * and based on that I'm generating TupleN[Array[Byte], ...](null, ...)
 * where N is number of members in class represented by type T
 */
}
Run Code Online (Sandbox Code Playgroud)

我打算只使用案例类作为T.

当我将这个宏与case类一起使用时,它工作得很好,但现在我想添加一个抽象级别:

trait WithGeneratedField[T] {
  val _myField = generateField[T]
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是当声明特性时宏会被扩展,在那时T被称为抽象类型'T'.有没有办法推迟宏观扩张,直到我把这个特性与具体的东西混合在一起?例如:

case class MyClass(a: String, b: Int) extends WithGeneratedField[MyClass]
Run Code Online (Sandbox Code Playgroud)

最后,我的目标是使用宏将生成的字段添加到案例类.也许还有更好的方法吗?

reflection macros scala

5
推荐指数
1
解决办法
206
查看次数

如何计算用于 deflate 压缩的良好预设字典

我有机会预设字典以进行 deflate 压缩。这对我来说是有意义的,因为要压缩的数据相对较小,为 1kb-3kb,而且我有大量代表性示例。要压缩的数据由任意字节序列组成,因此标记化等不是一个好方法。此外,数据显示大量重复(数据示例之间),因此好的字典可能会给出非常好的结果。问题是如何算出好的字典呢?是否有一种算法可以计算最佳字典(给定样本数据)?

我开始研究前缀树,但不清楚如何在这种情况下使用它们。

最好的问候,贾里克

compression gzip zlib deflate jzlib

5
推荐指数
1
解决办法
1888
查看次数

标签 统计

macros ×2

reflection ×2

scala ×2

compression ×1

deflate ×1

gzip ×1

jzlib ×1

zlib ×1