1

我目前正在使用 Scala 中的临时多态性编写一些代码。

例如,我的一个类Stream[Boolean]使用方法扩展了 a:

implicit class BooleanStreamOps(s: Stream[Boolean]) {

  def toByteStream: Stream[Byte] = ???

  // ...

}

现在到目前为止这很好,但是当流被打印时(例如通过 specs2),它将打印整个流,如果它已经被评估过,则会向控制台的输出发送垃圾邮件。

现在我正在尝试覆盖 toString,但我想我必须为包含 Stream 的类创建一个额外的类,如下所示:

final case class BooleanStream(unwrap: Stream[Boolean]) {

  override def toString: String = s"Stream(${unwrap.size})"

}

implicit class BooleanStreamOps(s: BooleanStream) {

  def toByteStream: Stream[Byte] = ???

}

这具有很好的效果,即也使用 Stream[Boolean] 的库用户不会意外调用我的方法之一。不利的一面是,每当我使用实际的流时,我都必须在对象上调用 unwrap,这会使代码相当混乱。

我认为我的选择是:

  1. 教 specs2 使用猫的 Show[T] 而不是使用 toString - 可能吗?我已经看到有一个包specs2-cats - 但我似乎无法为 scala 2.12 找到它。
  2. 如上所述,在每次使用流时使用 unwrap

您认为以上哪个选项最适合我的情况?

非选项:

  1. 从 Stream 扩展我自己的课程 - 有充分的理由将其密封
  2. 编写流映射的所有方法来解包 - IMO 工作量太大
4

0 回答 0