เมื่อไร
ใน Scheme แม้ว่า if จะดูหรูหราและใช้งานได้หลากหลาย แต่อาจทำให้เกิดความสับสนได้เมื่อใช้โดยไม่มี else ที่ชัดเจน สิ่งนี้จะเกิดขึ้นจริงโดยเฉพาะอย่างยิ่งเมื่อมีความตั้งใจที่จะรันโค้ดสาขาเดียวเฉพาะเมื่อเงื่อนไขเป็นจริงเท่านั้น โดยไม่มีการดำเนินการอื่นสำหรับ false case ในสถานการณ์เช่นนี้ โครงสร้าง when มอบทางเลือกที่ชัดเจนและกระชับยิ่งขึ้น
รูปแบบพื้นฐานของ when มีลักษณะดังนี้:
(when test-is-true
do-this
do-that)- หาก
testประเมินเป็นจริง (#t) นิพจน์ทั้งหมดในส่วนเนื้อหาของwhenโครงสร้างจะถูกดำเนินการตามลำดับ - หาก
testประเมินเป็นเท็จ (#f) แสดงว่าไม่มีอะไรเกิดขึ้น และไม่มีการส่งคืนค่าใด ๆ
ตัวอย่าง
(when (< 0 1)
(lumi-message "Condition is true!")
(lumi-message "Executing additional actions."))ตัดกัน if และ when
เพื่อให้เข้าใจความแตกต่างระหว่าง if และ when ได้ดียิ่งขึ้น โปรดพิจารณาตัวอย่างต่อไปนี้ที่ใช้ทั้งสองอย่างร่วมกัน:
(if (= 0 1)
(lumi-message "This will not run")
(when (< 0 1)
(lumi-message "The 'when' condition is true!")
(lumi-message "Executing multiple actions within 'when'.")))คำอธิบาย:
เงื่อนไข
if:- การทดสอบ
(= 0 1)ตรวจสอบว่า 0 เท่ากับ 1 หรือไม่ - เนื่องจากนี่เป็นเท็จ (
#f) สาขาelseของifจึงถูกดำเนินการ
- การทดสอบ
**
whenสร้างในสาขาelse**:- การทดสอบ
when(< 0 1)ตรวจสอบว่า 0 น้อยกว่า 1 หรือไม่ - เนื่องจากสิ่งนี้เป็นจริง (
#t) นิพจน์ทั้งหมดภายในเนื้อหาของwhenจะถูกดำเนินการตามลำดับ:- First, it prints
"The 'when' condition is true!". - Then, it prints
"Executing multiple actions within 'when'.".
- First, it prints
- การทดสอบ
ทำไมต้องใช้ when ที่นี่
- การใช้
whenแทนifอื่นจะช่วยลดความซับซ้อนของตรรกะเมื่อไม่จำเป็นต้องใช้สาขาelseที่ชัดเจนสำหรับเงื่อนไข whenทำให้ชัดเจนว่าเฉพาะสาขาที่แท้จริงเท่านั้นที่เกี่ยวข้อง ช่วยลดความสับสนที่อาจเกิดขึ้น
สรุป
- ใช้
ifเมื่อคุณต้องการทั้งสาขาจริงและเท็จ - ใช้
whenเมื่อกรณีจริงมีเพียงสาขาเดียว โดยเฉพาะอย่างยิ่งเมื่อจำเป็นต้องดำเนินการหลายอย่าง - การรวม
ifและwhenเข้าด้วยกันสามารถช่วยจัดโครงสร้างเงื่อนไขที่ซับซ้อนมากขึ้นได้อย่างชัดเจนและกระชับ