มีวิธีใดบ้างที่จะไม่ส่งคืนบางสิ่งโดยใช้ CoffeeScript?


116

ดูเหมือนว่า CoffeeScript จะส่งคืนรายการสุดท้ายในขอบเขตโดยอัตโนมัติ ฉันสามารถหลีกเลี่ยงฟังก์ชันนี้ได้หรือไม่?


ทำไมคุณถึงต้องการ? คุณไม่สามารถทิ้งมูลค่าที่ส่งคืนเมื่อคุณต้องการได้หรือไม่?
คริส

11
@ คริส: เมื่อไม่มีค่าตอบแทนที่มีความหมายการรั่วไหลไม่ว่าจะเป็นผลของคำสั่งสุดท้ายไม่ใช่ความคิดที่ดี

11
@Chris สิ่งนี้อาจมีผลกระทบต่อประสิทธิภาพด้วยความเข้าใจ / for / while ลูปด้วยเช่นกันเนื่องจาก Coffeescript อาจรวบรวมผลลัพธ์ของการวนซ้ำแต่ละครั้งในอาร์เรย์หากใช้ค่าส่งคืนของลูป (หรือหากเป็นนิพจน์สุดท้ายของฟังก์ชัน)
Arnaud Le Blanc

1
ฉันเพิ่งมีปัญหานี้กับผู้รับเหมา ฉันกำหนดฟังก์ชันในบรรทัดสุดท้ายของตัวสร้าง ดังนั้นสิ่งนี้จึงถูกส่งกลับมาแทน "Class-Function" ของฉัน ฉันต้องคืนสิ่งนี้อย่างชัดเจน แค่บอกว่านี่อาจเป็นปัญหาได้
Markus

คำตอบ:


150

คุณต้องไม่ส่งคืนสิ่งใดอย่างชัดเจนหรือปล่อยให้นิพจน์ประเมินเป็นไม่ได้กำหนดไว้ที่ด้านล่างของฟังก์ชันของคุณ:

fun = ->
    doSomething()
    return

หรือ:

fun = ->
    doSomething()
    undefined

นี่คือสิ่งที่เอกสารแนะนำเมื่อใช้ความเข้าใจ:

ระวังว่าคุณไม่ได้ตั้งใจที่จะกลับผลของการเข้าใจในกรณีเหล่านี้โดยการเพิ่มค่าตอบแทนที่มีความหมายเหมือน - ความจริง - หรือโมฆะไปด้านล่างของฟังก์ชั่นของคุณ


อย่างไรก็ตามคุณสามารถเขียนกระดาษห่อหุ้มได้ดังนี้:

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

(สังเกตตัวดำเนินการ Splatที่นี่ ( ...))

และใช้ในลักษณะนี้เมื่อกำหนดฟังก์ชัน:

fun = voidFun ->
    doSomething()
    doSomethingElse()

หรือเช่นนี้:

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

ขอบคุณสำหรับคำตอบที่ให้ข้อมูลนี้ ฉันเองก็สงสัยเกี่ยวกับเรื่องนี้เช่นกันขณะที่ฉันกำลังเรียนรู้เรื่องกาแฟ ฉันอยากรู้ว่าคุณพอจะชี้ให้เห็นได้ไหมว่าทางเลือกใดที่ดีที่สุดหรือทางเลือกที่แย่ที่สุดคืออะไรเมื่อป้องกันการคืนค่า โดยเฉพาะฉันได้รับการบอกตัวเลือกที่มีการเพิ่มอย่างใดอย่างหนึ่งreturn, undefinedหรือnullที่ส่วนท้ายของฟังก์ชั่นของฉัน อย่างไรก็ตามการเพิ่มnullดูเหมือนจะผิดสำหรับฉันด้วยเหตุผลบางประการ ฉันคิดถูกไหมที่คิดว่ามันเป็นตัวเลือกที่แย่ที่สุดในสามตัวนี้
stefmikhail

2
ใน javascript ฟังก์ชันที่ไม่มีคำสั่ง return (หรือคำสั่ง return ที่ว่างเปล่า) จะส่งคืนค่าที่ไม่ได้กำหนดดังนั้นตัวเลือกที่ดีที่สุดคือเพิ่มผลตอบแทนที่ว่างเปล่าหรือปล่อยทิ้งไว้undfinedตอนท้าย การใช้returnคำสั่งว่างเปล่าดูเหมือนจะไม่ส่งผลอะไรที่ดีไปกว่าการปล่อยให้undefinedส่วนท้ายของฟังก์ชันดังนั้นช่องว่างreturnจึงเป็นตัวเลือกที่ดีกว่า
Arnaud Le Blanc

2
แทนมันจะดีกว่าที่จะโทรfun(arguments...) fun.apply(this, arguments)
Miguel Madero

4
ที่จริงแล้ว "return" และ "undefined" จะสร้าง javascript ที่แตกต่างกัน การใช้ "ลองใช้ Coffeescript" ที่coffeescript.orgจะเห็นได้ว่าการรวม "return" ในกาแฟจะลบการส่งคืนจากจาวาสคริปต์อย่างชัดเจน ในขณะที่ด้วย "undefined" ฟังก์ชันจาวาสคริปต์จะลงท้ายด้วย "return void 0;"
Daniel

1
ฉันคิดว่าคุณอาจต้องระวัง voidFun เพราะฉันสงสัยว่าฟังก์ชันภายในจะยังคงส่งคืนสิ่งที่ต้องการซึ่งอาจทำให้ประสิทธิภาพลดลง
AturSams

10

ใช่โดยมีreturnเป็นบรรทัดสุดท้ายของฟังก์ชัน

ตัวอย่างเช่น,

answer = () ->
  42

extrovert = (question) -> 
  answer()

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

หากคุณต้องการที่จะเห็นสิ่ง js compiles กาแฟลองhttp://bit.ly/1enKdRl (ฉันใช้ Coffeescript redux สำหรับตัวอย่างของฉัน)


1
ฉันคิดว่ามันถูกลดคะแนนเพราะคำตอบนี้ไม่ได้เพิ่มมูลค่าใด ๆ นอกเหนือจากคำตอบที่มีอยู่แล้วในคำตอบที่ได้รับการโหวตสูงสุดซึ่งก็จะได้รับ 2 ปีก่อนคำตอบนี้!
kumarharsh

5

เพียงแค่บางสิ่งบางอย่างที่สนุก (เฉพาะทาง)

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

Function.prototypeตัวมันเองเป็นฟังก์ชันที่ไม่คืนค่าใด ๆ เสมอ คุณสามารถใช้การเขียนเพื่อกำหนดค่าที่ส่งคืนของคุณลงในแบล็คโฮลนี้และฟังก์ชันที่ประกอบด้วยจะไม่ส่งกลับอะไรเลย



-1

ดูเหมือนว่าฟังก์ชันใน CoffeeScript จะต้องส่งคืนบางอย่างnullเสมอ ใน C คุณมีvoidเป็นประเภทผลตอบแทน ->ฟังก์ชันว่างคอมไพล์(function() {})ดังนั้นจึงเป็นฟังก์ชันเดียวที่ไม่ส่งคืนอะไรเลย


ที่ไม่เป็นความจริง. return;ทำงานใน C, JavaScript และ CoffeeScript เพื่อส่งคืนค่าโมฆะ
ปปปป
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.