¿Hay alguna forma de no devolver algo usando CoffeeScript?

116

Parece que CoffeeScript devuelve automáticamente el último elemento de un alcance. ¿Puedo evitar esta funcionalidad?

Shamoon
fuente
¿Por qué querrías hacerlo? ¿No puedes simplemente descartar el valor devuelto cuando quieras?
Chris
11
@Chris: Cuando no hay un valor de retorno significativo, filtrar lo que sea que sea el resultado de la última declaración no es una buena idea.
11
@Chris, esto también puede tener implicaciones de rendimiento con bucles de comprensión / for / while, ya que coffeescript puede recopilar el resultado de cada iteración en una matriz, si se usa el valor de retorno del bucle (o si es la última expresión de una función)
Arnaud Le Blanc
1
Acabo de tener este problema con un constructor. Definí una función en la última línea del constructor. Entonces esto fue devuelto en lugar de mi "Función de clase". Tuve que devolver esto explícitamente. Solo digo que esto puede ser un problema.
Markus

Respuestas:

150

Debe devolver nada explícitamente o dejar una expresión que se evalúe como indefinida en la parte inferior de su función:

fun = ->
    doSomething()
    return

O:

fun = ->
    doSomething()
    undefined

Esto es lo que recomienda el documento, al usar comprensiones:

Tenga cuidado de no devolver accidentalmente los resultados de la comprensión en estos casos, agregando un valor de retorno significativo , como verdadero, o nulo, al final de su función .


Sin embargo, podría escribir un contenedor como este:

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

(Observe el operador de splat aquí ( ...))

Y utilícelo así al definir funciones:

fun = voidFun ->
    doSomething()
    doSomethingElse()

O así:

fun = voidFun(->
    doSomething()
    doSomethingElse()
)
Arnaud Le Blanc
fuente
Gracias por esta informativa respuesta. Yo también me he estado preguntando sobre esto ya que actualmente estoy aprendiendo coffeescript. Tengo curiosidad por saber si puede arrojar algo de luz sobre cuál es la mejor opción, o cuál sería la peor opción al evitar la devolución de un valor. En concreto, se me ha dicho que las opciones son o bien añadir return, undefinedo nullhasta el final de mi función. Sin embargo, agregar me nullparece incorrecto por alguna razón. ¿Estoy en lo cierto al asumir que es la peor opción de las tres?
stefmikhail
2
En javascript, una función sin declaración de devolución (o una declaración de devolución vacía) devuelve indefinido, por lo que la mejor opción es agregar una devolución vacía o dejar una undfinedal final. El uso de una returndeclaración vacía parece expresar un retorno nada mejor que dejar un undefinedal final de la función, por lo que el vacío returnparece ser la mejor opción.
Arnaud Le Blanc
2
En lugar de fun(arguments...), sería mejor llamar fun.apply(this, arguments).
Miguel Madero
4
En realidad, "return" y "undefined" generan diferentes javascript. Usando "Probar Coffeescript" en coffeescript.org , uno puede ver que incluir explícitamente "return" en coffeescript elimina el retorno del javascript; mientras que, con "undefined", la función javascript termina con "return void 0;"
Daniel
1
Creo que es posible que deba tener cuidado con voidFun porque sospecho que la función interna aún devolverá lo que quiera, lo que podría causar una degradación del rendimiento.
AturSams
10

Si, con un return como última línea de una función.

Por ejemplo,

answer = () ->
  42

extrovert = (question) -> 
  answer()

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

Si desea ver con qué js se compila el café, pruebe http://bit.ly/1enKdRl . (He usado coffeescript redux para mi ejemplo)

gprasant
fuente
1
Creo que se votó negativamente porque esta respuesta no agrega ningún valor aparte del que ya está en la respuesta más votada, que también se da 2 años antes de esta.
Kumarharsh
5

Solo algo divertido (opcional)

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

Function.prototypeen sí misma es una función que siempre no devuelve nada. Puede usar componer para canalizar su valor de retorno a este agujero negro y la función compuesta nunca devolverá nada.

códigos_ming
fuente
1
longRunningFunctionWithNullReturn = ->
  longRunningFunction()
  null
yfeldblum
fuente
-1

Parece que las funciones en CoffeeScript siempre deben devolver algo, incluso null. En C, tiene voidcomo tipo de retorno. ->, la función vacía, se compila (function() {}), por lo que es la única función que no devuelve nada.

L01man
fuente
Eso no es cierto. return;funciona en C, JavaScript y CoffeeScript para devolver un valor nulo.
yyny