【问题标题】:Scala extending the List class with a coalesce preappend methodScala 使用合并预附加方法扩展 List 类
【发布时间】:2012-04-03 23:47:40
【问题描述】:

我正在尝试创建一个新的运营商:?在列表上,其操作与 :: 相同,但如果值为 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))

【问题讨论】:

  • 在 Scala 中应该避免使用null;请改用Optionnull 确实只是为了与 Java 的互操作性而存在。

标签: list scala coalesce extending


【解决方案1】:

您想要的是增强我的图书馆模式。有了这个,您可以向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)

【讨论】:

  • “因为 Scala 的规则是,当且仅当它以 : 结尾时,运算符才是右结合的。” - 正是我想要的,谢谢!
猜你喜欢
  • 2011-03-04
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多