การดำเนินการที่สามใน CoffeeScript


318

ฉันจำเป็นต้องตั้งค่าให้เป็นไปaตามเงื่อนไข

วิธีที่สั้นที่สุดในการทำเช่นนี้กับ CoffeeScript คืออะไร

เช่นนี้เป็นวิธีที่ฉันจะทำใน JavaScript:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10

120
<rant> ฉันหวังว่าสคริปต์กาแฟสามารถรองรับไวยากรณ์ของผู้ประกอบการที่ประกอบไปด้วยได้ง่ายกว่าและสั้นกว่าif else then </rant>
AJP

2
@AJP ฉันคิดว่า ternary จะทำให้กาแฟ Ruby-ish น้อยลงแม้ว่า Ruby จะมีสิ่งนั้น เป้าหมายของกาแฟคือความสามารถในการอ่านและการปัดเศษของมุมที่หยาบ
jcollum

37
@jcollum เห็นด้วย แต่สิ่งที่ฉันคิดว่าน่าa = true ? 5 : 10ประหลาดใจที่สุดคือcoffeescript ที่ถูกต้อง แต่ไม่ได้หมายถึงโครงสร้างที่ประกอบไปด้วยแทน (ใน javascript) มันหมายถึง: a = true ? true : {5:10}ซึ่งเรียกว่าเป็นสิ่งที่ไม่ดี®นอกจากนี้a = false ? {5 : 10}ใน coffeescript (ใน javascript) เทียบเท่า: a = true ? false : {5:10} สำหรับสิ่งที่คุ้มค่าฉันไม่คิดว่ามันดี
AJP

2
มันอาจเป็นการดีที่สุดหากต้องสะกดว่า .. จากนั้น.. เพื่อหา CoffeeScript การ ในฐานะผู้ดำเนินการที่มีอยู่ทำให้รู้สึกมากbeast = yeti ? "bear"หรือif yeti? then alert "It's a yeti!"ทำให้การใช้งาน?ค่อนข้างดี
Paul Oliver

3
ผู้ประกอบการที่แยกต่างหากไม่จำเป็นจริงๆใน CoffeeScript เนื่องจากif/then/elseเป็นนิพจน์แล้วและทำสิ่งเดียวกัน หากคุณขาดหายไปจริงๆคุณจะคุ้นเคยกับไวยากรณ์ของ C หรือ JavaScript มากกว่าที่ต้องการ ถ้ามันไม่สามารถอ่านได้เพียงพอและบางครั้งมันก็เกิดขึ้นเพียงแค่ห่อนิพจน์ทั้งหมดไว้ในวงเล็บ ผู้ประกอบการ?ได้รับการงดเว้นสำหรับการตรวจสอบที่มีประโยชน์มากขึ้นซึ่งขาดใน JavaScript ตามที่ระบุไว้แล้วโดย @PaulOliver ผู้ประกอบการที่มีอยู่เป็นสิ่งที่ดีที่สุด
skalee

คำตอบ:


544

if/elseเมื่อทุกอย่างคือการแสดงออกและจึงส่งผลให้ค่าคุณก็สามารถใช้

a = if true then 5 else 10
a = if false then 5 else 10

ท่านสามารถดูรายละเอียดเพิ่มเติมเกี่ยวกับตัวอย่างการแสดงออกที่นี่


8
ฉันเดาว่ามีเหตุผลสำหรับ coffeescript ที่ไม่สนับสนุนไวยากรณ์ ternary เริ่มต้นจาวาสคริปต์หรือไม่
Augustin Riedinger

41
เหตุผลคือการตั้งค่าของผู้สร้างสำหรับบางสิ่งบางอย่าง "น้อยลับ" และน้อยตามอำเภอใจ (เช่นgithub.com/jashkenas/coffeescript/issues/11#issuecomment-97802 ) [2 เซนต์ของฉัน - ในขณะที่ฉันตระหนักถึงความเด็ดขาดของ?: ฉันคิดว่าif..then..elseมันมากเกินไปแทนสิ่งที่ควรจะเป็นการแสดงออกที่รัดกุม และ: เป็นมาตรฐานที่ฝังแน่นมากในหลายภาษา JavaScript ในหมู่พวกเขา แม้จะมีทั้งหมดที่ดูเหมือนว่าจะตั้งอยู่ในหินในขั้นตอนนี้]
mahemoff

1
ฉันเห็นด้วยกับผู้เขียน CoffeeScript ฉันมักจะคิดวากยสัมพันธ์แบบไตรภาคที่น่าเกลียดและไม่ได้ใช้งานง่าย หากคุณสามารถใช้if then elseในบรรทัดเดียวกันทำได้ก็คือมันมีอักขระเพิ่มอีก 7 ตัวเพื่อความชัดเจนและความสง่างาม
Joshua Pinter

ขึ้นอยู่กับรสนิยม แต่ฉันมีการตั้งค่าที่แข็งแกร่งสำหรับสัญลักษณ์มากกว่าคำหลักเช่น->กว่าfunctionหรือ{ }มากกว่าbegin .. endเพราะผมชอบที่จะเห็นสัญญาณสูงเสียงอัตราส่วนที่คำที่ถูกสงวนไว้สำหรับตรรกะฟังก์ชั่นที่เฉพาะเจาะจงและตรรกะในการดำเนินงานจะผลักไสส่วนใหญ่ เพื่อสัญลักษณ์
mahemoff

ไดรฟ์ทั้งหมดเพื่อลบสิ่งที่เป็นโครงสร้างข้ามภาษามาตรฐานจริง ๆ เพียงแค่ขันคนที่กำลังทำการบำรุงรักษาโดยเฉพาะอย่างยิ่งเมื่อคุณเพิ่มสิ่งที่ 'ประโยชน์' อื่น ๆ เช่นปั๊ก ... ถ้าคุณไม่สามารถอนุมานลำดับอาร์กิวเมนต์และวงเล็บผีทั้งหมด ...
Grunion Shaftoe


21

ในเกือบทุกภาษาสิ่งนี้ควรใช้งานได้แทน:

a = true  && 5 || 10
a = false && 5 || 10

38
วิธีนี้ใช้ได้ผล แต่ชัดเจนน้อยกว่าและไม่มีเหตุผลที่จะทำในภาษาใด ๆ ที่มีไวยากรณ์ที่ดีกว่าสำหรับมัน
อิบราฮิม

10
มันไม่เทียบเท่าในหลายภาษาที่มีการแปลงfalseค่าเป็นค่าโดยนัยเช่น 0, null, ไม่ได้กำหนด, …และอื่น ๆ
Lord of the Goo

12
@ อิบราฮิมนี่ใช้งานได้เป็นแบบไตรภาคตามเงื่อนไขก็ต่อเมื่อส่วนหลัง&&เครื่องหมายเป็นความจริงมิฉะนั้นจะส่งคืนส่วนสุดท้ายซึ่งไม่ใช่วิธีการทำงานแบบมีเงื่อนไข
pepkin88

แตกต่างอย่างแม่นยำ! :)
Pierre Voisin

จากตัวอย่างทั้งหมดนี่คือสิ่งที่ฉันคิดว่าเป็นเรื่องยากที่สุดที่จะบอกว่าตัวแปรในภาษาใดก็ตามที่ฉันอาจเจอ - espeically lanugage เช่น CoffeeScript (หรือ Ruby) ที่เว้นวรรคไม่เสมอช่องว่าง
Toni Leigh

12

Coffeescript ไม่สนับสนุนผู้ประกอบการที่ประกอบไปด้วยจาวาสคริปต์ นี่คือเหตุผลจากผู้เขียน coffeescript :

ฉันรักผู้ประกอบการที่ประกอบไปด้วยจำนวนมากพอ ๆ กับผู้ชายคนต่อไป (อาจจะมากกว่าเดิม) แต่ไวยากรณ์ไม่ใช่สิ่งที่ทำให้พวกเขาดี - พวกเขายอดเยี่ยมเพราะพวกเขาสามารถใส่ if / else ในบรรทัดเดียวเป็น การแสดงออก

ไวยากรณ์ของพวกเขาเป็นเพียงส่วนหนึ่งของเวทย์มนตร์ลึกลับที่จะท่องจำโดยไม่มีอะนาล็อกกับสิ่งอื่นใดในภาษา ผลที่ออกมาเท่ากันฉันจะค่อนข้างif/elsesเหมือนกันเสมอ (และเรียบเรียงเป็นนิพจน์เสมอ)

ดังนั้นใน CoffeeScript แม้ ifs หลายบรรทัดจะรวบรวมเป็น ternaries เมื่อเหมาะสมเช่นเดียวกับถ้า statement ที่ไม่มีประโยคอื่น:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

ทั้งคู่กลายเป็นไตรภาคีทั้งคู่สามารถใช้เป็นนิพจน์ได้ มันสอดคล้องกันและไม่มีไวยากรณ์ใหม่ให้เรียนรู้ ขอบคุณสำหรับคำแนะนำ แต่ฉันปิดตั๋วนี้เป็น "wontfix"

โปรดอ้างอิงถึงปัญหา GitHub: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802


3

คุณอาจเขียนมันในสองประโยคหากส่วนใหญ่เป็นการใช้งานจริง:

a = 5
a = 10 if false

หรือใช้คำสั่ง switch หากคุณต้องการความเป็นไปได้มากขึ้น:

a = switch x
  when true then 5
  when false then 10

ด้วยบูลีนมันอาจมีขนาดใหญ่ แต่ฉันคิดว่ามันอ่านง่ายมาก


1

รุ่น Multiline (เช่นหากคุณต้องการเพิ่มความคิดเห็นหลังจากแต่ละบรรทัด):

a = if b # a depends on b
then 5   # b is true 
else 10  # b is false

0

CoffeeScriptไม่มีผู้ประกอบการที่สาม นั่นคือสิ่งที่เอกสารพูด

คุณยังสามารถใช้ไวยากรณ์เช่น

a = true then 5 else 10

มันชัดเจนกว่ามาก

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