如何(适当地)丰富标准库?
How to (properly) enrich the standard library?
我想定义一个从 Iterator[T]
到我定义的 class 的隐式转换:ProactiveIterator[A]
.
真正的问题不是如何去做,而是如何正确地去做,即把方法放在哪里,以便它尽可能透明和不引人注目。理想情况下,它应该是 scala.Predef
中从 String
到 StringOps
的隐式转换 如果转换是从库中的 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
中的内容)。
我想定义一个从 Iterator[T]
到我定义的 class 的隐式转换:ProactiveIterator[A]
.
真正的问题不是如何去做,而是如何正确地去做,即把方法放在哪里,以便它尽可能透明和不引人注目。理想情况下,它应该是 scala.Predef
中从 String
到 StringOps
的隐式转换 如果转换是从库中的 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
中的内容)。