2015-10-28 23 views
9

Data la seguente funzione con parametri opzionali:Come saltare i parametri opzionali in Scala?

def foo(a:Int = 1, b:Int = 2, c:Int = 3) ... 

voglio mantenere il valore predefinito di un ma passare nuovi valori per b e c solo dalla cessione di posizione (piuttosto che da un nome assegnazione), sarebbe una delle seguenti sintassi:

foo(, 5, 7) 
foo(_, 5, 7) 

È qualcosa del genere possibile con Scala?

+1

Perché non etichettare i parametri? –

+0

Sono curioso che sia possibile anche in altre lingue? come Python, R, Java? –

+0

@Tripp: la ripetizione di tutti i nomi dei parametri (probabilmente anche nomi più lunghi) ad ogni singola chiamata di funzione è fastidiosa. Sono pigro :) Inoltre, penso che tralasciare una discussione sia molto chiaro e non ambiguo e persino semplice da implementare in una specifica del linguaggio. –

risposta

10

Non c'è modo di saltare i parametri, ma è possibile utilizzare i parametri denominati quando si chiama il metodo foo, ad esempio:

// Call foo with b = 5, c = 7 and the default value for a 
foo(b = 5, c = 7) 

Modifica - ti ha chiesto specificamente come farlo mediante cessione posizionale: questo non è possibile in Scala.

4

È possibile creare un'altra funzione, con uno dei parametri applicati.

def long(a: Int = 1, b: Int = 2, c: Int = 3) = a + b + c 

def short(x: Int, y: Int) = long(b = x, c = y) 

val s = short(10, 20) // s: Int = 31 
1

Una soluzione (lontano da abbastanza) potrebbe essere Currying

si avrebbe bisogno di cambiare la firma del metodo un po ':

// Just for "a" parameter 

def foo(a: Int = 1)(b: Int = 2, c: Int = 3) 

foo()(2,3) // 6 
foo(1)(2,3) // 6 
foo(2)(2,3) // 7 

Per tutti i parametri:

def foo(a: Int = 1)(b: Int = 2)(c: Int = 3) = a + b + c 

foo()()(3) // 6 
foo()(2)(3) // 6 
foo(2)()(3) // 7 
foo(3)()(3) // 8 
+0

Puoi anche usare 'foo.curried' per convertire foo nella sua forma al curry senza cambiare la firma del metodo. –