2016-06-29 31 views
5

Provo a tagliare una 1D Array[Double] usando il metodo slice. Ho scritto un metodo che restituisce l'indice iniziale e finale come una tupla (Int,Int).Affettare Scala Scala con tupla

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

Come posso utilizzare il valore di ritorno di getSliceRange direttamente?

ho provato:

myArray.slice.tupled(getSliceRange()) 

Ma questo dà la mia una fase di compilazione Errore:

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

risposta

5

Penso che il problema sia la conversione implicita da Array a ArrayOps (che ottiene slice da GenTraversableLike).

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

in breve: '(myArray.slice (_, _)). Tupla (getSliceRange())' fa il trucco. –

+0

Potete spiegare cosa significa '(doubleArray.slice (_, _)). Tupled'? –

+0

'doubleArray.slice (_, _)' è uguale a '(a, b) => doubleArray.slice (a, b)', abbiamo bisogno delle parentesi perché vogliamo chiamare 'tupla' sulla funzione e non sul risultato di 'slice'. –

1

due opzioni, il primo è quello di chiamare la funzione due volte:

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

o per salvare in anticipo il Tuple:

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

Edit: lascio questo qui solo nel caso in cui, ma Peter Neyens postato la risposta attesa.