Scala使用coalesce preappend方法扩展List类

J P*_*lar 3 scala list coalesce extending

我试图创建一个新的运算符:?在列表上,其操作与::相同,但如果值为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))
Run Code Online (Sandbox Code Playgroud)

dhg*_*dhg 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)
Run Code Online (Sandbox Code Playgroud)

因此,有一类EnhancedList是包装List的新方法,其中?:被定义,并且转换的隐函数ListEnhancedList?:被调用.请注意,您必须使用?:而不是:?因为Scala的规则使得运算符是正确关联的,当且仅当它以a结尾时才是:.

以下是它的使用方法:

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)
Run Code Online (Sandbox Code Playgroud)

  • +1,虽然我更愿意保留?:对于猫王 (5认同)