Czy jest jakiś sposób, aby nie zwrócić czegoś za pomocą CoffeeScript?

116

Wygląda na to, że CoffeeScript automatycznie zwraca ostatnią pozycję w zakresie. Czy mogę uniknąć tej funkcji?

Shamoon
źródło
Dlaczego miałbyś chcieć? Czy nie możesz po prostu odrzucić zwróconej wartości, kiedy chcesz?
Chris,
11
@Chris: Kiedy nie ma sensownej wartości zwracanej, wyciek czegokolwiek, co jest wynikiem ostatniej instrukcji, nie jest dobrym pomysłem.
11
@Chris może to mieć wpływ na wydajność również w przypadku pętli ze zrozumieniem / for / while, ponieważ coffeescript może zbierać wynik każdej iteracji w tablicy, jeśli używana jest wartość zwracana pętli (lub jeśli jest to ostatnie wyrażenie funkcji)
Arnaud Le Blanc
1
Właśnie miałem ten problem z konstruktorem. Zdefiniowałem funkcję w ostatnim wierszu konstruktora. Więc to zostało zwrócone zamiast mojej „funkcji-klasy”. Musiałem to wyraźnie zwrócić. Mówię tylko, że to może być problem.
Markus

Odpowiedzi:

150

Musisz jawnie nic nie zwracać lub pozostawić na dole funkcji wyrażenie oceniające jako niezdefiniowane:

fun = ->
    doSomething()
    return

Lub:

fun = ->
    doSomething()
    undefined

Oto, co zaleca dokument, gdy używasz wyrażeń:

Uważaj, aby przypadkowo nie zwrócić wyników interpretacji w takich przypadkach, dodając znaczącą wartość zwracaną - na przykład true - lub null na końcu funkcji .


Możesz jednak napisać opakowanie w ten sposób:

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

(Zwróć uwagę na operator splat tutaj ( ...))

I używaj tego w ten sposób podczas definiowania funkcji:

fun = voidFun ->
    doSomething()
    doSomethingElse()

Lub tak:

fun = voidFun(->
    doSomething()
    doSomethingElse()
)
Arnaud Le Blanc
źródło
Dziękuję za tę pouczającą odpowiedź. Ja też się nad tym zastanawiałem, ponieważ obecnie uczę się pisma kawowego. Ciekaw jestem, czy możesz rzucić trochę światła na najlepszy wybór, czy też najgorszy wybór, zapobiegając zwrotowi wartości? W szczególności, powiedziano mi, że opcje są też dodać return, undefinedlub nulldo końca mojej funkcji. Jednak dodawanie nullwydaje mi się z jakiegoś powodu niewłaściwe. Czy mam rację, zakładając, że jest to najgorszy wybór z całej trójki?
stefmikhail
2
W javascript funkcja bez instrukcji return (lub pustej instrukcji return) zwraca wartość niezdefiniowaną, więc najlepszą opcją jest dodanie pustego powrotu lub pozostawienie undfinedna końcu. returnWydaje się, że użycie pustej instrukcji nie zwraca nic lepszego niż pozostawienie znaku undefinedna końcu funkcji, więc pusta returnwydaje się być lepszą opcją.
Arnaud Le Blanc,
2
Zamiast tego fun(arguments...)lepiej zadzwonić fun.apply(this, arguments).
Miguel Madero
4
Właściwie „return” i „undefined” generują inny javascript. Używając „Try Coffeescript” na coffeescript.org , można zauważyć, że jawne włączenie słowa „return” w coffeescript usuwa zwrot z javascript; podczas gdy przy „undefined” funkcja javascript kończy się na „return void 0;”
Daniel
1
Myślę, że możesz być ostrożny z voidFun, ponieważ podejrzewam, że wewnętrzna funkcja nadal zwróci wszystko, czego chce, co prawdopodobnie może spowodować pogorszenie wydajności.
AturSams
10

Tak, z a returnjako ostatnim wierszem funkcji.

Na przykład,

answer = () ->
  42

extrovert = (question) -> 
  answer()

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

Jeśli chcesz zobaczyć, do czego skompilowana jest kawa, wypróbuj http://bit.ly/1enKdRl . (W moim przykładzie użyłem reduxu coffeescript)

gprasant
źródło
1
Myślę, że została odrzucona, ponieważ ta odpowiedź nie dodaje żadnej wartości poza tą, która już jest w odpowiedzi z największą liczbą głosów, która również została udzielona 2 lata przed tą!
kumarharsh
5

Po prostu coś fajnego (opcjonalne)

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

Function.prototypesama w sobie jest funkcją, która zawsze nic nie zwraca. Możesz użyć funkcji Compose, aby przesłać swoją zwracaną wartość do tej czarnej dziury, a skomponowana funkcja nigdy niczego nie zwróci.

ming_codes
źródło
1
longRunningFunctionWithNullReturn = ->
  longRunningFunction()
  null
yfeldblum
źródło
-1

Wygląda na to, że funkcje w CoffeeScript zawsze muszą coś zwracać, nawet null. W C masz voidjako typ zwracany. ->, pusta funkcja, kompiluje się do (function() {}), więc jest to jedyna funkcja, która nic nie zwraca.

L01man
źródło
To nieprawda. return;działa w C, JavaScript i CoffeeScript, aby zwrócić wartość void.
yyny