2016-06-29 8 views
5

Ich versuche eine 1D Array[Double] mit der slice Methode zu schneiden. Ich habe eine Methode geschrieben, die den Start- und Endindex als Tupel (Int,Int) zurückgibt.Scala Array Slicing mit Tuple

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

Wie kann ich den Rückgabewert von getSliceRange direkt benutzen?

Ich habe versucht:

myArray.slice.tupled(getSliceRange()) 

Aber das gibt mir einen Compiler-Fehler:

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()) 

Antwort

5

Ich denke, das Problem ist die implizite Konvertierung von Array zu ArrayOps (die slice von GenTraversableLike erhält).

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 
+3

kurz: '(myArray.slice (_, _)). Tupled (getSliceRange())' macht den Trick. –

+0

Können Sie erklären, was '(doubleArray.slice (_, _)). Tupled' bedeutet? –

+0

'doubleArray.slice (_, _)' ist das gleiche wie '(a, b) => doubleArray.slice (a, b)', wir brauchen die Klammern, weil wir 'tupled' für die Funktion aufrufen wollen und nicht auf das Ergebnis von 'slice'. –

1

zwei Möglichkeiten, die erste ist Ihre Funktion zweimal aufrufen:

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

oder um Ihre Tuple vorher zu speichern:

Edit: Ich lasse dies hier nur für den Fall, aber Peter Neyens veröffentlichte die erwartete Antwort.