Có cách nào để không trả lại nội dung nào đó bằng CoffeeScript không?


116

Có vẻ như CoffeeScript tự động trả về mục cuối cùng trong một phạm vi. Tôi có thể tránh chức năng này không?


Tại sao bạn sẽ muốn? Bạn không thể loại bỏ giá trị đã trả lại khi bạn muốn?
Chris

11
@Chris: Khi không có giá trị trả về có ý nghĩa, việc rò rỉ bất cứ điều gì xảy ra là kết quả của câu lệnh cuối cùng không phải là một ý kiến ​​hay.

11
@Chris điều này cũng có thể có ý nghĩa về hiệu suất với các vòng lặp hiểu / for / while, vì coffeescript có thể thu thập kết quả của mỗi lần lặp trong một mảng, nếu giá trị trả về của vòng lặp được sử dụng (hoặc nếu đó là biểu thức cuối cùng của một hàm)
Arnaud Le Blanc

1
Tôi vừa gặp sự cố này với một contructor. Tôi đã xác định một hàm trong dòng cuối cùng của hàm tạo. Vì vậy, điều này đã được trả lại thay vì "Lớp-Chức năng" của tôi. Tôi đã phải trả lại một cách rõ ràng điều này. Chỉ nói rằng đây có thể là một vấn đề.
Markus

Câu trả lời:


150

Bạn phải trả về không có gì một cách rõ ràng hoặc để lại một biểu thức đánh giá là không xác định ở cuối hàm của bạn:

fun = ->
    doSomething()
    return

Hoặc là:

fun = ->
    doSomething()
    undefined

Đây là những gì tài liệu khuyến nghị, khi sử dụng phần hiểu:

Hãy cẩn thận rằng bạn sẽ không vô tình trả về kết quả hiểu trong những trường hợp này, bằng cách thêm giá trị trả về có ý nghĩa - như true - hoặc null, vào cuối hàm của bạn .


Tuy nhiên, bạn có thể viết một trình bao bọc như thế này:

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

(Chú ý toán tử biểu tượng ở đây ( ...))

Và sử dụng nó như thế này khi xác định các hàm:

fun = voidFun ->
    doSomething()
    doSomethingElse()

Hoặc như thế này:

fun = voidFun(->
    doSomething()
    doSomethingElse()
)

Cảm ơn bạn cho câu trả lời thông tin này. Tôi cũng đã tự hỏi về điều này vì tôi hiện đang học coffeescript. Tôi tò mò liệu bạn có thể làm sáng tỏ đâu là lựa chọn tốt nhất, hay lựa chọn tồi tệ nhất sẽ là gì khi ngăn chặn sự trả lại của một giá trị? Cụ thể, tôi đã nói với các tùy chọn được thêm một trong hai return, undefinedhoặc nullđến hết chức năng của tôi. Tuy nhiên, việc thêm vào nullcó vẻ sai đối với tôi vì một số lý do. Tôi có đúng khi cho rằng đó là lựa chọn tồi tệ nhất trong ba lựa chọn không?
stefmikhail

2
Trong javascript, một hàm không có câu lệnh trả về (hoặc câu lệnh trả về trống) trả về không xác định, vì vậy tùy chọn tốt nhất là thêm một trả về trống hoặc để lại một dấu undfinedở cuối. Sử dụng một returncâu lệnh rỗng dường như để diễn đạt trả về không có gì tốt hơn nếu để lại một dấu undefinedở cuối hàm, do đó, giá trị trống returncó vẻ là lựa chọn tốt hơn.
Arnaud Le Blanc

2
Thay vì fun(arguments...), sẽ tốt hơn nếu gọi fun.apply(this, arguments).
Miguel Madero

4
Trên thực tế, "return" và "undefined" tạo ra các javascript khác nhau. Sử dụng "Thử Coffeescript" tại coffeescript.org , người ta có thể thấy rằng việc bao gồm "return" trong coffeescript một cách rõ ràng sẽ loại bỏ trả về khỏi javascript; trong khi, với "undefined", hàm javascript kết thúc bằng "return void 0;"
Daniel

1
Tôi nghĩ rằng bạn có thể cần phải cẩn thận với voidFun vì tôi nghi ngờ hàm bên trong vẫn sẽ trả về bất kỳ thứ gì nó muốn và điều này có thể gây ra sự suy giảm hiệu suất.
AturSams

10

Có, với a returnlà dòng cuối cùng của một hàm.

Ví dụ,

answer = () ->
  42

extrovert = (question) -> 
  answer()

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

Nếu bạn muốn xem cà phê biến thành thứ gì, hãy thử http://bit.ly/1enKdRl . (Tôi đã sử dụng coffeescript redux cho ví dụ của mình)


1
Tôi nghĩ rằng nó đã bị phản đối vì câu trả lời này không thêm bất kỳ giá trị nào ngoài câu trả lời đã có trong câu trả lời được bình chọn nhiều nhất, điều này cũng xảy ra 2 năm trước câu trả lời này!
kumarharsh

5

Chỉ là một cái gì đó vui vẻ (ctional)

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

Function.prototypebản thân nó là một hàm luôn không trả về. Bạn có thể sử dụng tính năng soạn để chuyển giá trị trả về của mình vào lỗ đen này và hàm soạn thảo sẽ không bao giờ trả lại bất kỳ thứ gì.


1
longRunningFunctionWithNullReturn = ->
  longRunningFunction()
  null

-1

Có vẻ như các hàm trong CoffeeScript luôn phải trả về một cái gì đó, ngay cả null. Trong C, bạn có voidkiểu trả về. ->, hàm trống, biên dịch thành (function() {}), vì vậy nó là hàm duy nhất không trả về bất kỳ thứ gì.


Đo không phải sự thật. return;hoạt động trong C, JavaScript và CoffeeScript để trả về giá trị void.
yyny
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.