2011-09-12 10 views
112

Sembra che CoffeeScript restituisca automaticamente l'ultimo oggetto in un ambito. Posso evitare questa funzionalità?C'è un modo per non restituire qualcosa usando CoffeeScript?

+0

Perché vuoi? Non puoi semplicemente scartare il valore restituito quando vuoi? – Chris

+10

@Chris: Quando non c'è un valore di ritorno significativo, la perdita di ciò che accade è il risultato dell'ultima istruzione non è una buona idea. – delnan

+10

@Chris questo può avere implicazioni sulle prestazioni con le stringhe di comprensione/per/while, poiché coffeescript può raccogliere il risultato di ogni iterazione in un array, se viene utilizzato il valore di ritorno del ciclo (o se è l'ultima espressione di una funzione) – arnaud576875

risposta

143

si deve tornare in modo esplicito nulla, o uscire da una valutazione di espressione per non definito nella parte inferiore della vostra funzione:

fun = -> 
    doSomething() 
    return 

Oppure:

fun = -> 
    doSomething() 
    undefined 

Questo è ciò che il documento raccomanda, quando usando le Comprensioni:

Attenzione a non restituire accidentalmente i risultati della comprensione in In questi casi, con si aggiunge un valore di ritorno significativo - come true - o null, nella parte inferiore della propria funzione.


Si potrebbe, tuttavia, scrivere un involucro simile a questo:

voidFun = (fun) -> 
    -> 
     fun(arguments...) 
     return 

(notare la splat operator qui (...))

e utilizzarlo come questo, quando la definizione delle funzioni:

fun = voidFun -> 
    doSomething() 
    doSomethingElse() 

O come questa:

fun = voidFun(-> 
    doSomething() 
    doSomethingElse() 
) 
+0

Grazie per questa risposta informativa. Anch'io mi sono chiesto questo mentre sto imparando il coffeescript. Sono curioso di sapere cosa è la scelta migliore o quale sarebbe la scelta peggiore quando si impedisce il ritorno di un valore? In particolare, mi è stato detto che le opzioni sono aggiungere "return", "undefined" o "null" alla fine della mia funzione. Tuttavia, aggiungere "null" mi sembra sbagliato per qualche motivo. Ho ragione di ritenerlo la peggiore scelta tra le tre? – stefmikhail

+2

In javascript una funzione senza istruzione return (o un'istruzione return vuota) restituisce undefined, quindi l'opzione migliore è quella di aggiungere un return vuoto o lasciare un 'undfined' alla fine. L'uso di un'istruzione vuota 'return' sembra esprimere * return nothing * meglio che lasciare un' indefinito' alla fine della funzione, quindi il 'return' vuoto sembra essere l'opzione migliore. – arnaud576875

+2

Invece di 'fun (argomenti ...)', sarebbe meglio chiamare 'fun.apply (this, arguments)'. –

1
longRunningFunctionWithNullReturn = -> 
    longRunningFunction() 
    null 
0

Sembra funzioni CoffeeScript devono sempre restituire qualcosa, anche null. In C, hai void come tipo di ritorno. ->, la funzione vuota, compila a (function() {}), quindi è l'unica funzione che non restituisce nulla.

+0

Non è vero. 'return;' funziona in C, JavaScript e CoffeeScript per restituire un valore void. – YoYoYonnY

5

solo qualcosa di divertente (finzionale)

suppressed = _.compose Function.prototype, -> 'do your stuff' 

Function.prototype è di per sé una funzione che restituisce sempre nulla. Puoi usare compose per convogliare il tuo valore di ritorno in questo blackhole e la funzione composta non restituirà mai nulla.

10

Sì, con return come ultima riga di una funzione.

Per esempio,

answer =() -> 
    42 

extrovert = (question) -> 
    answer() 

introvert = (question) -> 
    x = answer() 
    # contemplate about the answer x 
    return 

Se vuoi vedere che cosa js il caffè compila a, provare http://bit.ly/1enKdRl. (Ho usato redux coffeescript per il mio esempio)

+1

downvoter, commento per favore! – gprasant

+1

Penso che sia stato downvoted perché questa risposta non aggiunge alcun valore oltre a quello già presente nella risposta top-votata, che viene data anche 2 anni prima di questa! –

+1

Ma l'esempio è così bello. –

Problemi correlati