Apakah ada cara untuk tidak mengembalikan sesuatu menggunakan CoffeeScript?

116

Sepertinya CoffeeScript secara otomatis mengembalikan item terakhir dalam sebuah lingkup. Bisakah saya menghindari fungsi ini?

Shamoon
sumber
Mengapa Anda ingin? Tidak bisakah Anda membuang nilai yang dikembalikan saat Anda suka?
Chris
11
@ Chris: Jika tidak ada nilai pengembalian yang berarti, membocorkan apa pun yang terjadi sebagai hasil dari pernyataan terakhir bukanlah ide yang baik.
11
@Chris ini dapat memiliki implikasi kinerja dengan loop pemahaman / untuk / sementara juga, karena coffeescript dapat mengumpulkan hasil dari setiap iterasi dalam array, jika nilai kembalian dari loop digunakan (atau jika itu adalah ekspresi terakhir dari suatu fungsi)
Arnaud Le Blanc
1
Saya baru saja mengalami masalah ini dengan kontraktor. Saya mendefinisikan fungsi di baris terakhir konstruktor. Jadi ini dikembalikan, bukan "Class-Function" saya. Saya harus mengembalikan ini secara eksplisit. Hanya mengatakan, ini bisa menjadi masalah.
Markus

Jawaban:

150

Anda harus secara eksplisit tidak mengembalikan apa pun, atau membiarkan ekspresi mengevaluasi menjadi tidak terdefinisi di bagian bawah fungsi Anda:

fun = ->
    doSomething()
    return

Atau:

fun = ->
    doSomething()
    undefined

Inilah yang direkomendasikan oleh dok, saat menggunakan pemahaman:

Berhati-hatilah agar Anda tidak secara tidak sengaja mengembalikan hasil pemahaman dalam kasus ini, dengan menambahkan nilai pengembalian yang bermakna - seperti true - atau null, ke bagian bawah fungsi Anda .


Namun, Anda bisa menulis pembungkus seperti ini:

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

(Perhatikan operator percikan di sini ( ...))

Dan gunakan seperti ini saat mendefinisikan fungsi:

fun = voidFun ->
    doSomething()
    doSomethingElse()

Atau seperti ini:

fun = voidFun(->
    doSomething()
    doSomethingElse()
)
Arnaud Le Blanc
sumber
Terima kasih atas jawaban informatif ini. Saya juga telah bertanya-tanya tentang ini karena saya sekarang sedang belajar coffeescript. Saya ingin tahu apakah Anda dapat menjelaskan pilihan terbaik apa, atau pilihan terburuk apa yang akan menjadi saat mencegah kembalinya suatu nilai? Secara khusus, saya telah diberitahu pilihan yang menambah baik return, undefinedatau nullke akhir fungsi saya. Namun, menambahkan nulltampaknya salah bagi saya karena beberapa alasan. Apakah saya benar menganggapnya sebagai pilihan terburuk dari ketiganya?
stefmikhail
2
Dalam javascript sebuah fungsi tanpa pernyataan kembali (atau pernyataan pengembalian kosong) mengembalikan tidak terdefinisi, jadi opsi terbaik adalah menambahkan pengembalian kosong atau membiarkannya undfineddi akhir. Menggunakan returnpernyataan kosong tampaknya mengungkapkan tidak ada yang lebih baik daripada meninggalkan undefineddi akhir fungsi, jadi kosong returntampaknya menjadi pilihan yang lebih baik.
Arnaud Le Blanc
2
Alih-alih fun(arguments...), akan lebih baik menelepon fun.apply(this, arguments).
Miguel Madero
4
Sebenarnya, "return" dan "undefined" menghasilkan javascript yang berbeda. Menggunakan "Try Coffeescript" di coffeescript.org , orang dapat melihat bahwa secara eksplisit menyertakan "return" dalam coffeescript menghapus pengembalian dari javascript; sedangkan, dengan "undefined", fungsi javascript diakhiri dengan "return void 0;"
Daniel
1
Saya pikir Anda mungkin perlu berhati-hati dengan voidFun karena saya menduga fungsi bagian dalam masih akan mengembalikan apa pun yang diinginkannya yang mungkin bisa menyebabkan penurunan kinerja.
AturSams
10

Ya, dengan a returnsebagai baris terakhir dari suatu fungsi.

Sebagai contoh,

answer = () ->
  42

extrovert = (question) -> 
  answer()

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

Jika Anda ingin melihat apa saja yang dikompilasi kopi, coba http://bit.ly/1enKdRl . (Saya telah menggunakan coffeescript redux untuk contoh saya)

gprasant
sumber
1
Saya pikir itu tidak disukai karena jawaban ini tidak menambah nilai apa pun selain yang sudah ada di jawaban dengan suara terbanyak, yang juga diberikan 2 tahun sebelum jawaban ini!
kumarharsh
5

Hanya sesuatu yang menyenangkan (ctional)

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

Function.prototypeitu sendiri adalah fungsi yang selalu tidak menghasilkan apa-apa. Anda dapat menggunakan compose untuk memasukkan nilai yang dikembalikan ke dalam lubang hitam ini dan fungsi yang dibuat tidak akan pernah mengembalikan apa pun.

ming_codes
sumber
1
longRunningFunctionWithNullReturn = ->
  longRunningFunction()
  null
yfeldblum
sumber
-1

Tampaknya fungsi di CoffeeScript harus selalu mengembalikan sesuatu, bahkan null. Di C, Anda memiliki voidtipe pengembalian. ->, fungsi kosong, dikompilasi (function() {}), jadi itu satu-satunya fungsi yang tidak mengembalikan apa pun.

L01man
sumber
Itu tidak benar. return;bekerja di C, JavaScript dan CoffeeScript untuk mengembalikan nilai kosong.
yyny