2012-02-27 11 views

risposta

46

Implicita tipo Unit ritorno:

def f() {println("ABC")} 

esplicita tipo Unit ritorno:

def g(): Unit = {println("ABC")} 

Tipo di ritorno dedotta dall'ultimo metodo espressione, ancora Unit perché questo è il tipo di println, ma confusa:

def h() = println("ABC") 

Tutti i metodi sopra sono equivalenti. Preferirei f() perché la mancanza dell'operatore = dopo la firma del metodo da sola è sufficiente per me. Utilizzare esplicito : Unit quando si desidera documentare ulteriormente il metodo. L'ultima forma è confusa e in realtà trattata come un avviso in .

L'operatore = è fondamentale. Se è presente significa: "si prega di restituire qualsiasi cosa l'ultima dichiarazione restituisce" nel corpo del metodo. Ovviamente non è possibile utilizzare questa sintassi per i metodi abstract. Se non lo è, si assume Unit.

+0

Grazie Tomasz. Il codice che hai condiviso richiama un'altra domanda: perché ti è permesso di omettere il segno '=' in 'f' e' g'? – balteo

+2

Se la funzione restituisce 'Unità', è possibile omettere il segno' = '. Qualsiasi funzione definisce senza un segno '=' restituisce 'Unità' – Nicolas

+1

Perché nelle funzioni' Unità' il '=' è opzionale. Tuttavia è obbligatorio per tutti gli altri tipi poiché restituiscono effettivamente qualcosa –

14

La sintassi speciale per le procedure (metodi che restituiscono Unità) è stato un errore. Non usarlo È confuso e pericoloso per i principianti con un background Java/C (++). Ed è un trattamento speciale non necessario. Usare sempre il segno di uguale, con e senza inferenza di tipo (quest'ultimo deve essere utilizzato solo per i soci privati):

def foo(): Unit = someCodeReturningUnit() 

private def bar() = someCodeReturningUnit() 
+1

La [sezione guida stile] (http://docs.scala-lang.org/style/types.html#void_methods) dovrebbe essere aggiornata se si è giusto riguardo al "trattamento speciale non necessario". – agilesteel

+0

@agilesteel C'è sempre stata una polemica su quella sezione. –

+0

La guida di stile [dice] (http://docs.scala-lang.org/style/declarations#procedure-syntax): "Evita la sintassi della procedura, in quanto tende a confondere per ottenere un guadagno minimo in brevità." –

6

La comunità Scala è diviso su di esso. Da un lato, non utilizzare tipi di reso espliciti significa che puoi facilmente dimenticare il segno =, il che si traduce in errori che sono spesso fastidiosi da tracciare. D'altra parte, Unit - i metodi di restituzione con una sintassi diversa li mettono in una categoria separata, che piace ad alcune persone.

Personalmente, preferirei che questa sintassi scomparisse: gli errori risultanti dalla mancanza di =sono fastidiosi da tracciare. Ma non è nemmeno deprecato, quindi preferirei sfruttarlo piuttosto che subire i problemi della sua esistenza.

Quindi, utilizzare quello che desideri. Ci saranno persone che criticano la tua scelta in entrambi i modi, e la gente lo elogia in ogni modo.

Problemi correlati