PAYATHON 2026

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。

备注:内容仅供参考。