3

新しい演算子を作成しようとしています:?リストでは、値がnullの場合を除いて、::と同じように動作し、元のリストが返されます。私は次のように書いていますが、私が何をしているのか本当にわからないことにすぐに気づきました。

object ImplicitList {
   implicit def extendIterator[T](i : List[T]) = new ListExtension(i)

 }

 class ListExtension[T <: Any](i : List[T]) {
  def :?[B >: T] (x: B): List[B] = if (x != null) x :: i else i
 }


 final case class :?[B](private val hd: B, private val tl: ListExtension[B]) extends ListExtension[B](tl.:?(hd))
4

1 に答える 1

13

あなたが望むのは、enhance-my-library パターンです。これにより、新しいメソッドを に追加できますList。これがどのように見えるかです:

class EnhancedList[T](self: List[T]) {
  def ?:(t: T) = 
    t match {
      case null => self
      case _ => t :: self
    }
}
implicit def enhanceList[T](self: List[T]) = new EnhancedList(self)

したがって、新しいメソッドが定義されている場所EnhancedListをラップするクラスと、呼び出されたときに変換する暗黙の関数があります。Scalaの規則では、演算子が.List?:ListEnhancedList?:?::?:

使用方法は次のとおりです。

scala> val l = List("a","b","c")
l: List[java.lang.String] = List(a, b, c)

scala> null ?: l
res136: List[java.lang.String] = List(a, b, c)

scala> "d" ?: l
res137: List[java.lang.String] = List(d, a, b, c)
于 2012-03-19T13:37:42.790 に答える