วัตถุประสงค์ของผู้ดำเนินการเครื่องหมายคำถามใน 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"
test
test ?d, "/dev"
test "d", "/dev"