soong 指出,我实际上正在寻找“Pimp my library”模式,然后我查找了该模式,并像这样实现以处理有问题的方法:
implicit class BlingList[+A](l: List[A]) {
def foldRVL[B](z: B)(f: (A, B) => B): B = //"Right-Via-Left"
l.foldLeft(z)((a, b) => f(b, a))
}
据我了解,允许点表示法的关键要素是拥有一个类构造,该构造采用我想要“拉皮条”的类型的参数。在这种情况下,我有一个列表,我想foldRVL
在写下列表后调用列表,如下所示
List(something).foldRVL(z)(f: A => B)
:因此,我需要一个带有List[A]
参数的类,以便能够在第一个代码片段中编写类似的方法。
使用该implicit
关键字,以便我可以向现有方法添加方法,class List
而无需创建单独的方法库。任何时候List
发现foldRVL
a在. 因此,它将查找在作用域中定义的任何隐式方法,这些方法具有方法并以 a作为参数,并发现具有已定义的方法并以 a 为参数。因此,我现在可以写:BlingList
List
class List
foldRVL
List
implicit class BlingList
foldRVL
List[A]
List(1,2,3).foldRVL(0)(_ + _) // in some IDE's, foldRVL will be underlined to show that
res0: Int = 6 // an implicit conversion is being made
“一个 Scala 2.10 隐式类示例”对此进行了更深入的介绍。那篇文章中我最喜欢的指针是将您希望在当前包中使用的所有隐式类以及 a 内的任何子包中package object
,这样您就不必使用隐式类定义来混淆您的任何类或对象,您也不必导入它们。由于package object
.