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))
}
私が理解している限り、ドット表記を許可するための重要な要素は、「pimped」したい型のパラメーターを取るクラス構成を持つことです。foldRVL
この場合、リストがあり、次のように、リストを書き留めた後でリスト
を呼び出したいと考えていますList(something).foldRVL(z)(f: A => B)
。List[A]
したがって、最初のコード スニペットでそのようなメソッドを記述できるようにするには、パラメーターを受け取るクラスが必要です。
このimplicit
キーワードはclass List
、メソッドのライブラリを個別に作成しなくても、既存のメソッドを追加できるようにするために使用されます。の前に接頭辞が付いている aList
が見つかった場合は常にfoldRVL
、暗黙的に 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 の暗黙的なクラスの例」では、これについてさらに詳しく説明しています。その投稿からの私のお気に入りのポインタは、現在のパッケージとサブパッケージで使用することが予想されるすべての暗黙的なクラスを .xml 内に配置するpackage object
ことです。これにより、クラスやオブジェクトを暗黙的なクラス定義で混乱させる必要がなくなります。それらをインポートする必要もありません。それらが同じパッケージを使用しているという事実は、package object
.