วัตถุประสงค์ของผู้ดำเนินการเครื่องหมายคำถามใน Ruby คืออะไร?
บางครั้งมันดูเหมือนว่านี้:
assert !product.valid?
บางครั้งมันอยู่ในifโครงสร้าง
วัตถุประสงค์ของผู้ดำเนินการเครื่องหมายคำถามใน Ruby คืออะไร?
บางครั้งมันดูเหมือนว่านี้:
assert !product.valid?
บางครั้งมันอยู่ในifโครงสร้าง
คำตอบ:
มันเป็นรูปแบบการประชุมรหัส; มันบ่งชี้ว่าวิธีการส่งกลับค่าบูลีน
เครื่องหมายคำถามคืออักขระที่ถูกต้องในตอนท้ายของชื่อวิธี
?ในรูบี (เป็นโอเปอเรเตอร์แบบไตรภาคการแปลงอักขระเป็นจำนวนเต็ม ASCII, การใช้งานในtest, ใน RegEx'es, ฯลฯ ) ซึ่งส่วนใหญ่ครอบคลุมในคำตอบอื่น ๆ ที่นี่
isEmpty(), isDigit()ฯลฯ ในทับทิมวิธีการเดียวกันจะถูกเขียนempty?และdigit?ที่ค่อนข้างบิตดีกว่า IMO
isตลอดเวลา ซึ่งอาจจะทำให้เกิดความสับสนสุดสำหรับคนที่มาจากสวิฟท์ตั้งแต่เครื่องหมายคำถามมีใช้สำหรับnullable:)
โปรดทราบ?พร้อมกับอักขระจะส่งคืนรหัสอักขระ ASCII สำหรับA
ตัวอย่างเช่น:
?F # => will return 70
อีกวิธีหนึ่งในทับทิม 1.8 คุณสามารถทำ:
"F"[0]
หรือในทับทิม 1.9:
"F".ord
นอกจากนี้ยังแจ้งให้ทราบว่า?Fจะกลับสตริง"F"ดังนั้นในการที่จะทำให้รหัสสั้นคุณยังสามารถใช้?F.ordในรูบี 1.9 "F".ordที่จะได้รับผลเช่นเดียวกับ
'F'
มันเป็นข้อตกลงใน Ruby ที่เมธอดที่ส่งคืนค่าบูลีนสิ้นสุดในเครื่องหมายคำถาม ไม่มีอะไรสำคัญไปกว่านี้อีกแล้ว
ในตัวอย่างของคุณเป็นเพียงส่วนหนึ่งของชื่อวิธีการ ใน Ruby คุณสามารถใช้เครื่องหมายอัศเจรีย์ในชื่อเมธอดได้!
อีกตัวอย่างของเครื่องหมายคำถามใน Ruby จะเป็นผู้ประกอบการที่สาม
customerName == "Fred" ? "Hello Fred" : "Who are you?"
ในตัวอย่างของคุณ
product.valid?
valid?เป็นจริงการเรียกฟังก์ชั่นและการเรียกฟังก์ชั่นที่มีชื่อว่า ฟังก์ชัน "test for condition" / บูลีนบางประเภทมีเครื่องหมายคำถามเป็นส่วนหนึ่งของชื่อฟังก์ชันตามระเบียบปฏิบัติ
มันอาจคุ้มค่าที่จะชี้ให้เห็นว่า?อนุญาตให้ใช้ในชื่อเมธอดไม่ใช่ตัวแปรเท่านั้น ในกระบวนการของการเรียนรู้ทับทิมฉันคิดว่าการ?กำหนดประเภทผลตอบแทนบูลีนดังนั้นฉันพยายามเพิ่มพวกเขาไปที่ตัวแปรธงนำไปสู่ข้อผิดพลาด สิ่งนี้ทำให้ฉันเชื่ออย่างผิด ๆ ไประยะหนึ่งว่ามีไวยากรณ์พิเศษบางอย่างที่เกี่ยวข้องกับ?s
ที่เกี่ยวข้อง: เหตุใดชื่อตัวแปรจึงลงท้ายด้วย `ไม่ได้" ในขณะที่ชื่อวิธีสามารถทำได้
ฉันเชื่อว่ามันเป็นเพียงการประชุมสำหรับสิ่งต่าง ๆ ที่บูลีน ชอบพูดว่า " IsValid"
มันยังใช้ในการแสดงออกปกติความหมาย "ที่ซ้ำซ้อนที่สุดของตัวละครก่อนหน้า"
ตัวอย่างเช่นนิพจน์ปกติ/hey?/ ตรงกับสตริง " he" และ " hey"
มันเป็นวิธีการทั่วไปที่จะใช้กับอาร์กิวเมนต์แรกของวิธีทดสอบจากKernel # test
irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true
เท่าที่เห็นในคำถามนี้ที่นี่
test, เป็นทางลัดสำหรับ?d ใช้เวลาหนึ่งสตริงถ่านเป็นอาร์กิวเมนต์แรกของตนเพื่อให้คุณสามารถเรียกมันด้วยหรือ "d"testtest ?d, "/dev"test "d", "/dev"