【问题标题】:pattern match returns a different result for ArrayBuffer and Seq模式匹配为 ArrayBuffer 和 Seq 返回不同的结果
【发布时间】:2016-03-01 16:00:20
【问题描述】:

在下面的示例中,有一个函数 seqResultSeq 匹配。另一个接受可变参数的函数调用seqResult 并传入ArrayBuffer。这会导致在使用SeqArrayBuffer 调用时模式匹配结果不同。

Seq 匹配器匹配case head :: rest => ...ArrayBuffer 匹配器匹配case Seq(one, two) => ...

这是一个错误吗?有没有办法防止这种情况发生?

如果这不是错误,那么有什么安全方法可以匹配一个或多个适用于 Seq(a,b)ArrayBuffer(a,b) 的条目列表?

def seqResult(arr:Seq[String]) = arr match {
  case Nil =>  "Nil"
  case head :: Nil => "head :: Nil"
  case head :: rest => "head :: rest"
  case Seq(one, two) => "one, two"
  case _ => "other"
}

def varArgResult(args:String*) = seqResult(args)

val ab = varArgResult("one", "two")
val se = seqResult(Seq("one", "two"))

println(ab) //=> "one, two"
println(se) //=> "head :: rest"

【问题讨论】:

    标签: scala scala-2.11


    【解决方案1】:

    ::Lists 的提取器对象。由于列表是Seq 的默认实现,这就是您在使用Seq(a, b, ...) 时所看到的。

    Seqs 的提取器是 +:

    【讨论】:

    • 干杯 - 我在寻找什么
    【解决方案2】:

    args: String*实际上是Array

    Seq() 构造函数使用基于 ListBuffer 的构建器,因此我们有 List 数据类型。

    object Seq extends SeqFactory[Seq] {
      def newBuilder[A]: Builder[A, Seq[A]] = new mutable.ListBuffer
    }
    

    ...

    println(Seq("one", "two"))
    
    List(one, two)
    

    head::restList 匹配的语法糖,可以表示为List(head, rest),在您的情况下匹配se

    【讨论】:

    • 刚刚添加了最后一个问题 - 在这种情况下,最佳匹配选项是什么?
    猜你喜欢
    • 1970-01-01
    • 2018-10-16
    • 2019-05-26
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    相关资源
    最近更新 更多