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

jmo*_*ora 1 methodology scala implicit-conversion

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

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

到目前为止,我已经考虑添加一个包含这些转换对象,类似于JavaConversions,但是更好的选项可能是可能的.

Mic*_*jac 6

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

所以你会有一些implicits对象:

package foo.bar

object Implicits {
   implicit class ProactiveIterator[A](i: Iterator[A]) {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

然后,您必须在使用它的任何地方显式导入它:

import foo.bar.Implicits._
Run Code Online (Sandbox Code Playgroud)

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


你可以类似地将你的暗示放在一个package object.您必须以相同的方式将它们导入到其他命名空间中,但它们可用于同一包中的类.

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

package foo

package object bar {
   implicit class ProactiveIterator[A](i: Iterator[A]) {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

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