PPrint 如何只省略 Some 的 value 参数名?
数据小陈
结论
可以通过 additionalHandlers 单独处理 Some,并在处理器中递归调用同一个 PPrinter 的 treeify。这样只会改变 Some(...) 的输出形式,其他 case class 仍按 PPrint 的原有配置生成字段名。
实现方式
将打印器定义为 lazy val,这样 Some 处理器就能复用它自身:
lazy val specialHandle: pprint.PPrinter =
pprint.PPrinter.BlackWhite.copy(additionalHandlers = {
case Some(value) =>
pprint.Tree.Apply(
"Some",
Iterator(specialHandle.treeify(value, true, true))
)
})
specialHandle.pprintln(myValue)
这个处理器匹配任意 Some,不必针对 Byte、String 或其他泛型类型分别添加分支。treeify 会继续让 PPrint 处理内部值,包括字符串转义、数值格式和嵌套 case class。Tree.Apply 表示 Some(...) 的调用结构,换行和缩进仍由 PPrint 决定。
适用条件
不同版本的 PPrint 和 Scala 可能表现不同。如果当前版本已经默认将 Some(value = x) 输出为 Some(x),升级到包含该行为的版本即可;如果仍显示 value =,可以使用上面的处理器。旧版本或特定 Scala 构建环境下,先确认所用版本支持这段 treeify API。
备注:内容仅供参考。
