Existe-t-il un moyen de ne pas retourner quelque chose en utilisant CoffeeScript?

116

Il semble que CoffeeScript renvoie automatiquement le dernier élément d'une étendue. Puis-je éviter cette fonctionnalité?

Shamoon
la source
Pourquoi voudriez-vous? Ne pouvez-vous pas simplement supprimer la valeur renvoyée quand vous le souhaitez?
Chris le
11
@Chris: Lorsqu'il n'y a pas de valeur de retour significative, la fuite de tout ce qui se trouve être le résultat de la dernière instruction n'est pas une bonne idée.
11
@Chris cela peut également avoir des implications sur les performances avec les boucles compréhensions / for / while, car coffeescript peut collecter le résultat de chaque itération dans un tableau, si la valeur de retour de la boucle est utilisée (ou si c'est la dernière expression d'une fonction)
Arnaud Le Blanc
1
Je viens d'avoir ce problème avec un constructeur. J'ai défini une fonction dans la dernière ligne du constructeur. Donc, cela a été retourné à la place de ma "Classe-Fonction". J'ai dû renvoyer explicitement ceci. Je dis simplement que cela peut être un problème.
Markus

Réponses:

150

Vous devez explicitement ne rien renvoyer, ou laisser une expression évaluée à indéfinie en bas de votre fonction:

fun = ->
    doSomething()
    return

Ou:

fun = ->
    doSomething()
    undefined

C'est ce que le doc recommande, lors de l'utilisation de compréhensions:

Veillez à ne pas renvoyer accidentellement les résultats de la compréhension dans ces cas, en ajoutant une valeur de retour significative - comme true - ou null, au bas de votre fonction .


Vous pouvez cependant écrire un wrapper comme celui-ci:

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

(Remarquez l' opérateur splat ici ( ...))

Et utilisez-le comme ceci lors de la définition des fonctions:

fun = voidFun ->
    doSomething()
    doSomethingElse()

Ou comme ça:

fun = voidFun(->
    doSomething()
    doSomethingElse()
)
Arnaud Le Blanc
la source
Merci pour cette réponse informative. Moi aussi, je me suis posé des questions à ce sujet alors que j'apprends actuellement à café. Je suis curieux de savoir si vous pouvez faire la lumière sur quel est le meilleur choix, ou quel serait le pire choix pour empêcher le retour d'une valeur? Plus précisément, on m'a dit les options sont à ajouter soit return, undefinedou nullà la fin de ma fonction. Cependant, l'ajout nullme semble faux pour une raison quelconque. Ai-je raison de supposer que c'est le pire choix parmi les trois?
stefmikhail
2
En javascript, une fonction sans instruction de retour (ou une instruction de retour vide) renvoie undefined, donc la meilleure option est soit d'ajouter un retour vide, soit de laisser un undfinedà la fin. L'utilisation d'une returninstruction vide semble n'exprimer rien de mieux que de laisser un undefinedà la fin de la fonction, donc le vide returnsemble être la meilleure option.
Arnaud Le Blanc
2
Au lieu de fun(arguments...), il vaudrait mieux appeler fun.apply(this, arguments).
Miguel Madero
4
En fait, "return" et "undefined" génèrent des javascript différents. En utilisant "Try Coffeescript" sur coffeescript.org , on peut voir qu'inclure explicitement "return" dans coffeescript supprime le retour du javascript; alors que, avec "undefined", la fonction javascript se termine par "return void 0;"
Daniel
1
Je pense que vous devrez peut-être faire attention avec voidFun car je soupçonne que la fonction interne retournera toujours ce qu'elle veut, ce qui pourrait éventuellement provoquer une dégradation des performances.
AturSams
10

Oui, avec un returncomme dernière ligne d'une fonction.

Par exemple,

answer = () ->
  42

extrovert = (question) -> 
  answer()

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

Si vous souhaitez voir en quoi js le café se compile, essayez http://bit.ly/1enKdRl . (J'ai utilisé coffeescript redux pour mon exemple)

gprasant
la source
1
Je pense qu'elle a été déclassée car cette réponse n'ajoute aucune valeur en dehors de celle déjà présente dans la réponse la plus votée, qui se trouve également donnée 2 ans avant celle-ci!
kumarharsh
5

Juste quelque chose d'amusant (ctional)

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

Function.prototypeelle-même est une fonction qui ne renvoie toujours rien. Vous pouvez utiliser compose pour diriger votre valeur de retour dans ce trou noir et la fonction composée ne retournera jamais rien.

ming_codes
la source
1
longRunningFunctionWithNullReturn = ->
  longRunningFunction()
  null
Yfeldblum
la source
-1

Il semble que les fonctions de CoffeeScript doivent toujours renvoyer quelque chose, même null. En C, vous avez voidcomme type de retour. ->, la fonction vide, compile vers (function() {}), donc c'est la seule fonction qui ne renvoie rien.

L01man
la source
Ce n'est pas vrai. return;fonctionne en C, JavaScript et CoffeeScript pour renvoyer une valeur void.
yyny