首页 文章

Scala中嵌套数组上的模式匹配

提问于
浏览
2

我想创建 Any 类型的数组,它看起来像:

val arr: Array[Any] = Array(Array(1, 2, Array(3)), 4)

然后我想使用此代码使用尾递归使其变平:

def flatten(xs: Array[Any]): Array[Any] = {

    @tailrec
    def makeFlat(xs: List[Any], res: List[Any]): List[Any] = xs match {
      case Nil => res
      case head :: tail => head match {
        case h: Array[Any] => makeFlat(h.toList ::: tail, res)
        case _ => makeFlat(tail, res :+ head)
      }
    }

    makeFlat(xs.toList, Nil).toArray
}

我正在使用Scala 2.12版本 .

当迭代从源数组进入内部数组 Array(3) 时,模式匹配 case h: Array[Any] 不起作用 . 这很奇怪,因为 Int 扩展 Any . 我试图调试并意识到这个数组是 int[1] (原始int数组) .

为什么scala决定将它作为原始数组,以及如何弄清楚这种情况?

2 回答

  • 5

    它不起作用,因为你不会让它推断出类型 .

    case h: Array[Any] 替换为 case h: Array[_] ,你就是金色的 .

  • 0

    Array 是一个java类,而不是scala类

    它不支持差异

    http://docs.scala-lang.org/tutorials/tour/variances.html

相关问题