Scala расширяет класс List с помощью метода coalesce preappend - PullRequest
3 голосов
/ 19 марта 2012

Я пытаюсь создать нового оператора:? в списках, который работает так же, как ::, за исключением случаев, когда значение равно нулю, тогда возвращается исходный список. Я написал следующее, но вскоре до меня дошло, что я действительно не знаю, что делаю ...

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))

1 Ответ

13 голосов
/ 19 марта 2012

То, что вы хотите, это шаблон Enhify-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, который охватывает List, где определен новый метод ?:, и неявная функция, которая преобразует List в EnhancedList при вызове ?:. Обратите внимание, что вы должны использовать ?: вместо :?, потому что правила Scala таковы, что оператор является ассоциативным по праву тогда и только тогда, когда он заканчивается на :.

Вот как это используется:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...