Gibt es eine Möglichkeit, etwas nicht mit CoffeeScript zurückzugeben?

116

Es scheint, als würde CoffeeScript automatisch das letzte Element in einem Bereich zurückgeben. Kann ich diese Funktionalität vermeiden?

Shamoon
quelle
Warum willst du? Können Sie den zurückgegebenen Wert nicht einfach verwerfen, wenn Sie möchten?
Chris
11
@Chris: Wenn es keinen aussagekräftigen Rückgabewert gibt, ist es keine gute Idee, zu verlieren, was auch immer das Ergebnis der letzten Anweisung ist.
11
@Chris Dies kann auch Auswirkungen auf die Leistung mit dem Verständnis von / for / while-Schleifen haben, da coffeescript das Ergebnis jeder Iteration in einem Array erfassen kann, wenn der Rückgabewert der Schleife verwendet wird (oder wenn es der letzte Ausdruck einer Funktion ist)
Arnaud Le Blanc
1
Ich hatte gerade dieses Problem mit einem Konstrukteur. Ich habe eine Funktion in der letzten Zeile des Konstruktors definiert. Dies wurde also anstelle meiner "Klassenfunktion" zurückgegeben. Ich musste dies ausdrücklich zurückgeben. Ich sage nur, dass dies ein Problem sein kann.
Markus

Antworten:

150

Sie müssen explizit nichts zurückgeben oder einen Ausdruck, der ausgewertet wird, am Ende Ihrer Funktion undefiniert lassen:

fun = ->
    doSomething()
    return

Oder:

fun = ->
    doSomething()
    undefined

Dies ist, was der Arzt empfiehlt, wenn er Verständnis verwendet:

Stellen Sie sicher, dass Sie in diesen Fällen nicht versehentlich die Ergebnisse des Verständnisses zurückgeben, indem Sie am Ende Ihrer Funktion einen aussagekräftigen Rückgabewert - wie true - oder null hinzufügen .


Sie könnten jedoch einen Wrapper wie folgt schreiben:

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

(Beachten Sie den Splat-Operator hier ( ...))

Und verwenden Sie es so, wenn Sie Funktionen definieren:

fun = voidFun ->
    doSomething()
    doSomethingElse()

Oder so:

fun = voidFun(->
    doSomething()
    doSomethingElse()
)
Arnaud Le Blanc
quelle
Vielen Dank für diese informative Antwort. Auch ich habe mich darüber gewundert, als ich gerade Coffeescript lerne. Ich bin gespannt, ob Sie etwas Licht in die beste oder die schlechteste Wahl bringen können, wenn Sie die Rückgabe eines Wertes verhindern möchten. Insbesondere wurde mir mitgeteilt, dass die Optionen entweder oder am Ende meiner Funktion hinzugefügt werden returnsollen . Das Hinzufügen scheint mir jedoch aus irgendeinem Grund falsch zu sein. Habe ich Recht, wenn ich davon ausgehe, dass es die schlechteste Wahl unter den dreien ist? undefinednullnull
Stefmikhail
2
In Javascript gibt eine Funktion ohne return-Anweisung (oder eine leere return-Anweisung) undefiniert zurück. Daher ist es am besten, entweder eine leere return-Anweisung hinzuzufügen oder eine undfinedam Ende zu belassen. Die Verwendung einer leeren returnAnweisung scheint die Rückgabe nichts Besseres auszudrücken als das Verlassen einer undefinedam Ende der Funktion, daher returnscheint die leere die bessere Option zu sein.
Arnaud Le Blanc
2
Stattdessen fun(arguments...)wäre es besser anzurufen fun.apply(this, arguments).
Miguel Madero
4
Tatsächlich erzeugen "return" und "undefined" unterschiedliche Javascript. Wenn Sie "Try Coffeescript" auf coffeescript.org verwenden , können Sie sehen, dass das explizite Einfügen von "return" in coffeescript die Rückgabe aus dem Javascript entfernt. Bei "undefined" endet die Javascript-Funktion mit "return void 0".
Daniel
1
Ich denke, Sie müssen möglicherweise mit voidFun vorsichtig sein, da ich vermute, dass die innere Funktion immer noch alles zurückgibt, was sie will, was möglicherweise zu Leistungseinbußen führen kann.
AturSams
10

Ja, mit a returnals letzte Zeile einer Funktion.

Beispielsweise,

answer = () ->
  42

extrovert = (question) -> 
  answer()

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

Wenn Sie sehen möchten, wozu der Kaffee kompiliert wird, versuchen Sie es mit http://bit.ly/1enKdRl . (Ich habe Coffeescript Redux für mein Beispiel verwendet)

gprasant
quelle
1
Ich denke, es wurde herabgestuft, weil diese Antwort keinen Wert hinzufügt, abgesehen von der Antwort, die bereits in der Antwort mit den höchsten Stimmen enthalten ist, die auch 2 Jahre vor dieser Antwort gegeben wird!
Kumarshar
5

Nur etwas Spaß (ctional)

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

Function.prototypeselbst ist eine Funktion, die immer nichts zurückgibt. Sie können compose verwenden, um Ihren Rückgabewert in dieses Blackhole zu leiten, und die komponierte Funktion gibt niemals etwas zurück.

ming_codes
quelle
1
longRunningFunctionWithNullReturn = ->
  longRunningFunction()
  null
Yfeldblum
quelle
-1

Es scheint, dass Funktionen in CoffeeScript immer etwas zurückgeben müssen, auch nicht null. In C haben Sie voidals Rückgabetyp. ->, die leere Funktion, wird kompiliert und (function() {})ist daher die einzige Funktion, die nichts zurückgibt.

L01man
quelle
Das ist nicht wahr. return;funktioniert in C, JavaScript und CoffeeScript, um einen ungültigen Wert zurückzugeben.
yyny