如何(适当地)丰富标准库?

How to (properly) enrich the standard library?

我想定义一个从 Iterator[T] 到我定义的 class 的隐式转换:ProactiveIterator[A].

真正的问题不是如何去做,而是如何正确地去做,即把方法放在哪里,以便它尽可能透明和不引人注目。理想情况下,它应该是 scala.Predef 中从 StringStringOps 的隐式转换 如果转换是从库中的 class 到其他 class,那么它可以在 class 中定义,但据我所知,这在这里是不可能的。

到目前为止,我已经考虑添加一个 object containing these conversions, similarly to JavaConversions,但可能会有更好的选择。

你真的没有太多选择。所有隐式必须包含在某种对象中,并使用通配符导入导入(您可以单独导入它们,但我怀疑您是否想要那样)。

所以你会有某种隐式对象:

package foo.bar

object Implicits {
   implicit class ProactiveIterator[A](i: Iterator[A]) {
      ...
   }
}

然后你必须在任何使用它的地方明确地导入它:

import foo.bar.Implicits._

在我看来,这是一件好事。阅读代码的人可能不明白您的拉皮条方法来自何处,因此显式导入非常有帮助。


您可以类似地将隐含项放在 package object 中。您必须以相同的方式将它们导入其他名称空间,但它们将可供同一包中的 classes 使用。

例如,使用以下内容,foo.bar 内的任何内容都将具有此隐式 class 可用:

package foo

package object bar {
   implicit class ProactiveIterator[A](i: Iterator[A]) {
      ...
   }
}

在其他地方你会 import foo.bar._(可能干净也可能不干净,取决于 bar 中的内容)。