【问题标题】:Scala type mismatch - found: Unit required: Array[String]Scala 类型不匹配 - 发现:所需单位:数组 [字符串]
【发布时间】:2018-07-06 17:08:26
【问题描述】:

我不明白为什么 Scala 在以下示例中抱怨类型错误:

def GetRanges(RangeString1: String): Array[String] = {
    val GetOneRange = "\\d+\\-\\d+".r;
    var AllRanges = new Array[String](0);
    if (!f_stringNullEmpty(RangeString1)) {
      GetOneRange.findAllIn(RangeString1).matchData.foreach(
        m => AllRanges = AllRanges ++ Array[String](m.group(0)) // Explicit casting to Array[String]
      )
    }
    return scala.util.Sorting.quickSort(AllRanges);
}

我收到的错误是:

 notebook:38: error: type mismatch;
 found   : Unit
 required: Array[String]
 return scala.util.Sorting.quickSort(AllRanges);
                                    ^

显然,遍历正则表达式结果并将它们添加到数组中会导致类型更改。但为什么? 还是我错过了一些更基本的东西?

注意:我知道 if 语句返回类型 Unit,因为没有指定其他类型。但我看不出这会影响我的数组类型。

【问题讨论】:

    标签: scala type-mismatch databricks


    【解决方案1】:

    scala.util.Sorting.quickSort(AllRanges) 的返回类型为Unit。但是,GetRanges 需要 Array[String]

    def GetRanges(RangeString1: String): Array[String] = {
    val GetOneRange = "\\d+\\-\\d+".r;
    

    这里是 quickSort 用于排序数组

     /** Sort array `a` with quicksort, using the Ordering on its elements.
        * This algorithm sorts in place, so no additional memory is used aside from
        * what might be required to box individual elements during comparison.
        */
      def quickSort[K: Ordering](a: Array[K]): Unit = {
        // Must have iN >= i0 or math will fail.  Also, i0 >= 0.
    

    【讨论】:

      【解决方案2】:

      quickSort() 在原地改变AllRanges 并仅返回Unit,但您已指定GetRanges() 返回Array[String],就好像quickSort() 正在返回Array(不是)。

      您可以通过将代码更改为以下内容来修复您的代码(注意,您无需指定return):

      scala.util.Sorting.quickSort(AllRanges)
      AllRanges
      

      FWIW,您还可以通过执行以下操作来避免使用 f_stringNullEmpty 和数组连接:

      def getRanges(s: String): Array[String] = {
        val p = """\d+\-\d+""".r
        Option(s).filter(_.nonEmpty).map(p.findAllIn) match {
          case Some(matches) if matches.nonEmpty =>
            val m = matches.toArray[String]
            scala.util.Sorting.quickSort(m)
            m
          case _ =>
            Array.empty[String]
        }
      }
      

      【讨论】:

      • 乔伊,谢谢。我希望 quickSort 返回有序数组,实际上它没有。仅供参考错误消息中 ^ 的位置让我认为 quickSort 的参数类型错误,而不是 quickSort 的返回类型是错误类型。每天学习...
      猜你喜欢
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      相关资源
      最近更新 更多