2012-03-19 3 views
3

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

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

И ваш вопрос? –

+3

Использование «null» следует избегать в Scala; вместо этого используйте 'Option'. 'null' действительно существует только для взаимодействия с Java. – Jesper

ответ

13

То, что вы хотите это улучшить-моя библиотека шаблон. С помощью этого вы можете добавить новый метод к 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) 
+5

+1, хотя я бы предпочел зарезервировать?: Для elvis – virtualeyes

+0

«потому что правила Scala заключаются в том, что оператор является право-ассоциативным тогда и только тогда, когда он заканчивается на:.» - именно то, что я искал, спасибо! –

Смежные вопросы