Existe alguma maneira de não retornar algo usando CoffeeScript?

116

Parece que o CoffeeScript retorna automaticamente o último item em um escopo. Posso evitar essa funcionalidade?

Shamoon
fonte
Por que você iria querer? Você não pode simplesmente descartar o valor retornado quando quiser?
Chris,
11
@Chris: Quando não há valor de retorno significativo, vazar o que quer que seja o resultado da última instrução não é uma boa ideia.
11
@Chris isso pode ter implicações de desempenho com compreensões / for / while loops também, já que o coffeescript pode coletar o resultado de cada iteração em uma matriz, se o valor de retorno do loop for usado (ou se for a última expressão de uma função)
Arnaud Le Blanc
1
Eu só tive esse problema com um construtor. Eu defini uma função na última linha do construtor. Portanto, isso foi retornado em vez de minha "Função de classe". Eu tive que devolver isso explicitamente. Só estou dizendo que isso pode ser um problema.
Markus

Respostas:

150

Você não deve retornar nada explicitamente ou deixar uma expressão avaliada como indefinida na parte inferior de sua função:

fun = ->
    doSomething()
    return

Ou:

fun = ->
    doSomething()
    undefined

Isso é o que o doc recomenda, ao usar compreensões:

Tenha cuidado para não retornar acidentalmente os resultados da compreensão nesses casos, adicionando um valor de retorno significativo - como true - ou nulo, na parte inferior de sua função .


Você poderia, no entanto, escrever um wrapper como este:

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

(Observe o operador splat aqui ( ...))

E use-o assim ao definir funções:

fun = voidFun ->
    doSomething()
    doSomethingElse()

Ou assim:

fun = voidFun(->
    doSomething()
    doSomethingElse()
)
Arnaud Le Blanc
fonte
Obrigado por esta resposta informativa. Eu também tenho me perguntado sobre isso enquanto estou aprendendo o coffeescript. Estou curioso para saber se você pode esclarecer qual é a melhor escolha, ou qual seria a pior escolha ao evitar a devolução de um valor? Especificamente, me foi dito que as opções são para adicionar tanto return, undefinedou nullaté o fim da minha função. No entanto, adicionar nullparece errado para mim por algum motivo. Estou certo em presumir que é a pior escolha entre as três?
stefmikhail
2
Em javascript, uma função sem instrução de retorno (ou uma instrução de retorno vazia) retorna indefinido, então a melhor opção é adicionar um retorno vazio ou deixar um undfinedno final. Usar uma returninstrução vazia parece expressar return nada melhor do que deixar um undefinedno final da função, portanto, vazio returnparece ser a melhor opção.
Arnaud Le Blanc
2
Em vez de fun(arguments...), seria melhor ligar fun.apply(this, arguments).
Miguel Madero
4
Na verdade, "return" e "undefined" geram javascript diferente. Usando "Try Coffeescript" em coffeescript.org , pode-se ver que incluir explicitamente "return" no coffeescript remove o retorno do javascript; enquanto que, com "indefinido", a função javascript termina com "return void 0;"
Daniel
1
Acho que você precisa ter cuidado com o voidFun porque suspeito que a função interna ainda retornará o que quiser, o que pode causar a degradação do desempenho.
AturSams
10

Sim com um return como a última linha de uma função.

Por exemplo,

answer = () ->
  42

extrovert = (question) -> 
  answer()

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

Se você gostaria de ver o que js o café compila, tente http://bit.ly/1enKdRl . (Eu usei redux do coffeescript para o meu exemplo)

gprasant
fonte
1
Acho que foi rejeitado porque essa resposta não agrega nenhum valor além do que já está na resposta mais votada, que também acontece 2 anos antes desta!
kumarharsh de
5

Apenas algo divertido (opcional)

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

Function.prototypeem si é uma função que sempre não retorna nada. Você pode usar compose para canalizar seu valor de retorno para este buraco negro e a função composta nunca retornará nada.

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

Parece que as funções em CoffeeScript devem sempre retornar algo, mesmo null. Em C, você tem voidcomo tipo de retorno. ->, a função vazia compila para (function() {}), portanto, é a única função que não retorna nada.

L01man
fonte
Isso não é verdade. return;funciona em C, JavaScript e CoffeeScript para retornar um valor void.
yyny