【问题标题】:Scala Array Slicing with TupleScala 数组切片与元组
【发布时间】:2016-06-29 11:54:25
【问题描述】:

我尝试使用slice 方法对一维Array[Double] 进行切片。我编写了一个方法,它以元组 (Int,Int) 的形式返回开始和结束索引。

  def getSliceRange(): (Int,Int) = {
    val start =   ...
    val end =  ...
    return (start,end)
  }

如何直接使用getSliceRange的返回值?

我试过了:

myArray.slice.tupled(getSliceRange())

但这给了我一个编译错误:

Error:(162, 13) missing arguments for method slice in trait IndexedSeqOptimized;
follow this method with `_' if you want to treat it as a partially applied function
  myArray.slice.tupled(getSliceRange())

【问题讨论】:

    标签: arrays scala tuples


    【解决方案1】:

    我认为问题在于从ArrayArrayOps 的隐式转换(从GenTraversableLike 得到slice)。

    val doubleArray = Array(1d, 2, 3, 4)
    
    (doubleArray.slice(_, _)).tupled
    
    Function.tupled[Int, Int, Array[Double]](doubleArray.slice)
    
    (doubleArray.slice: (Int, Int) => Array[Double]).tupled
    

    【讨论】:

    • 简而言之:(myArray.slice(_, _)).tupled(getSliceRange()) 可以解决问题。
    • 你能解释一下(doubleArray.slice(_, _)).tupled是什么意思吗?
    • doubleArray.slice(_, _)(a, b) => doubleArray.slice(a, b) 相同,我们需要括号,因为我们想在函数上调用tupled,而不是在slice 的结果上。
    【解决方案2】:

    这里有两个选项,第一个是调用你的函数两次:

    myArray.slice(getSliceRange()._1, getSliceRange()._2)
    

    或预先保存您的Tuple

    val myTuple: (Int, Int) = getSliceRange()
    myArray.slice(myTuple._1, myTuple._2)
    

    编辑:我把这个留在这里以防万一,但 Peter Neyens 发布了预期的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-16
      • 2012-11-10
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      相关资源
      最近更新 更多