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

你想要的是增强我的图书馆模式。有了这个,您可以向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了新方法?:的定义位置,以及一个转换为何时调用的隐ListEnhancedList函数?:。请注意,您必须使用?:而不是,:?因为 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)
于 2012-03-19T13:37:42.790 回答