C'è un modo per non restituire qualcosa usando CoffeeScript?


116

Sembra che CoffeeScript restituisca automaticamente l'ultimo elemento in un ambito. Posso evitare questa funzionalità?


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

11
@ Chris: Quando non c'è un valore di ritorno significativo, far trapelare qualunque cosa sia il risultato dell'ultima istruzione non è una buona idea.

11
@ Chris questo può avere implicazioni sulle prestazioni anche con i cicli di comprensione / for / 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)
Arnaud Le Blanc

1
Ho appena avuto questo problema con un costruttore. Ho definito una funzione nell'ultima riga del costruttore. Quindi questo è stato restituito al posto del mio "Class-Function". Ho dovuto restituirlo esplicitamente. Sto solo dicendo che questo può essere un problema.
Markus

Risposte:


150

Non devi restituire esplicitamente nulla o lasciare un'espressione che restituisce undefined in fondo alla tua funzione:

fun = ->
    doSomething()
    return

O:

fun = ->
    doSomething()
    undefined

Questo è ciò che consiglia il documento, quando si usano le comprensioni:

Fai attenzione a non restituire accidentalmente i risultati della comprensione in questi casi, aggiungendo un valore di ritorno significativo , come true, o null, alla fine della funzione .


Tuttavia, potresti scrivere un wrapper come questo:

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

(Notare l' operatore splat qui ( ...))

E usalo in questo modo quando definisci le funzioni:

fun = voidFun ->
    doSomething()
    doSomethingElse()

O in questo modo:

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

Grazie per questa risposta informativa. Anch'io me lo sono chiesto mentre sto imparando il coffeescript. Sono curioso se riesci a far luce su quale sia la scelta migliore, o quale sarebbe la scelta peggiore quando si impedisce il ritorno di un valore? In particolare, mi è stato detto le opzioni sono da aggiungere sia return, undefinedo nullfino alla fine della mia funzione. Tuttavia, l'aggiunta nullmi sembra sbagliata per qualche motivo. Ho ragione a presumere che sia la scelta peggiore delle tre?
stefmikhail

2
In javascript una funzione senza istruzione return (o un'istruzione return vuota) restituisce undefined, quindi l'opzione migliore è aggiungere un return vuoto o lasciare un undfinedalla fine. L'uso di un'istruzione vuota returnsembra esprimere return niente di meglio che lasciare un undefinedalla fine della funzione, quindi il vuoto returnsembra essere l'opzione migliore.
Arnaud Le Blanc

2
Invece fun(arguments...), sarebbe meglio chiamare fun.apply(this, arguments).
Miguel Madero

4
In realtà, "return" e "undefined" generano javascript diversi. Utilizzando "Try Coffeescript" su coffeescript.org , si può vedere che includere esplicitamente "return" in coffeescript rimuove il ritorno dal javascript; mentre, con "undefined", la funzione javascript termina con "return void 0;"
Daniel

1
Penso che potresti dover stare attento con voidFun perché sospetto che la funzione interna restituirà comunque ciò che vuole, il che potrebbe anche causare il degrado delle prestazioni.
AturSams

10

Sì, con una returncome ultima riga di una funzione.

Per esempio,

answer = () ->
  42

extrovert = (question) -> 
  answer()

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

Se desideri vedere in cosa js viene compilato il caffè, prova http://bit.ly/1enKdRl . (Ho usato coffeescript redux per il mio esempio)


1
Penso che sia stato svalutato perché questa risposta non aggiunge alcun valore a parte quello già presente nella risposta più votata, che viene data anche 2 anni prima di questa!
kumarharsh

5

Solo qualcosa di divertente (ctional)

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

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


1
longRunningFunctionWithNullReturn = ->
  longRunningFunction()
  null

-1

Sembra che le funzioni in CoffeeScript debbano sempre restituire qualcosa, anche null. In C, hai voidcome tipo di ritorno. ->, la funzione vuota, viene compilata (function() {}), quindi è l'unica funzione che non restituisce nulla.


Non è vero. return;funziona in C, JavaScript e CoffeeScript per restituire un valore void.
yyny
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.