如何(正确)丰富标准库?

时间:2015-04-14 18:13:30

标签: scala implicit-conversion methodology

我想定义从Iterator[T]到我定义的类的隐式转换:ProactiveIterator[A]

问题不是如何做到这一点,而是如何正确地做到这一点,即如何放置方法,以使其尽可能透明和不引人注目。理想情况下,它应该是scala.Predef中从StringStringOps的隐式转换。如果转换是从库中的类转换到其他类,那么它可以在该类中定义,但AFAIK在这里是不可能的。

到目前为止,我已考虑添加object containing these conversions,类似于JavaConversions,但可能有更好的选择。

1 个答案:

答案 0 :(得分:6)

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

所以你会有某种暗示对象:

package foo.bar

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

然后,无论您在何处使用它,都必须明确导入它:

import foo.bar.Implicits._

在我看来,这是一件好事。阅读代码的人可能无法理解你的拉皮条方法的来源,因此显式导入非常有用。


您可以类似地将您的隐含置于package object内。您必须以相同的方式将它们导入其他命名空间,但它们可用于同一包中的类。

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

package foo

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

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

相关问题