เครื่องหมายคำถามมีความหมายอย่างไรในรูบี?


211

วัตถุประสงค์ของผู้ดำเนินการเครื่องหมายคำถามใน Ruby คืออะไร?

บางครั้งมันดูเหมือนว่านี้:

assert !product.valid?

บางครั้งมันอยู่ในifโครงสร้าง


2
เครื่องหมายคำถามในตอนท้ายของฟังก์ชั่นไม่ใช่ตัวดำเนินการมันเป็นตัวอักษรธรรมดา เครื่องหมายคำถามพร้อมกับโคลอนเป็นตัวดำเนินการแบบมีเงื่อนไข เครื่องหมายคำถามด้วยตัวเองเป็นผู้ดำเนินการใบเสนอราคา unary ดูstackoverflow.com/questions/16641205/…
โปรเก่า

คำตอบ:


296

มันเป็นรูปแบบการประชุมรหัส; มันบ่งชี้ว่าวิธีการส่งกลับค่าบูลีน

เครื่องหมายคำถามคืออักขระที่ถูกต้องในตอนท้ายของชื่อวิธี


9
ขอบคุณ แต่อนุสัญญานี้หมายความว่าตรรกะเท่านั้นหรืออาจมีผลข้างเคียงหรือไม่ ขำ ๆ ว่านี่เป็นแฮ็ครอบ ๆ ภาษาที่พิมพ์ด้วยประเภทส่งคืนในรหัส
Jason

5
ในกรณีนี้มันเป็นระเบียบวิธีการตั้งชื่ออย่างเคร่งครัด ไม่มีการบังคับใช้ค่าส่งคืนบูลีน เพียงเพราะชื่อวิธีการลงท้ายด้วยเครื่องหมายคำถามไม่ได้หมายความว่าวิธีการจะต้องส่งกลับบูลีน ... แต่แน่นอนที่สุดควรกลับบูลีน อย่างไรก็ตามมีการใช้งานอื่น ๆ อีกหลายอย่าง?ในรูบี (เป็นโอเปอเรเตอร์แบบไตรภาคการแปลงอักขระเป็นจำนวนเต็ม ASCII, การใช้งานในtest, ใน RegEx'es, ฯลฯ ) ซึ่งส่วนใหญ่ครอบคลุมในคำตอบอื่น ๆ ที่นี่
Karl Wilbur

4
@Jason FYI แม้ภาษาที่พิมพ์อย่างมากจะมีแบบแผนเช่นนี้ ยกตัวอย่างเช่นใน Java วิธีการที่ส่งกลับค่าบูลีนมักจะนำหน้าด้วย "เป็น" ในขณะที่isEmpty(), isDigit()ฯลฯ ในทับทิมวิธีการเดียวกันจะถูกเขียนempty?และdigit?ที่ค่อนข้างบิตดีกว่า IMO
Ajedi32

3
Ajedi32 - ใช่ฉันเห็นด้วยว่ามันดีในการตั้งชื่อฟังก์ชั่นแบบนั้นฉันใช้isตลอดเวลา ซึ่งอาจจะทำให้เกิดความสับสนสุดสำหรับคนที่มาจากสวิฟท์ตั้งแต่เครื่องหมายคำถามมีใช้สำหรับnullable:)
เจสัน

83

โปรดทราบ?พร้อมกับอักขระจะส่งคืนรหัสอักขระ ASCII สำหรับA

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

?F # => will return 70

อีกวิธีหนึ่งในทับทิม 1.8 คุณสามารถทำ:

"F"[0]

หรือในทับทิม 1.9:

"F".ord

นอกจากนี้ยังแจ้งให้ทราบว่า?Fจะกลับสตริง"F"ดังนั้นในการที่จะทำให้รหัสสั้นคุณยังสามารถใช้?F.ordในรูบี 1.9 "F".ordที่จะได้รับผลเช่นเดียวกับ


29
ในทับทิม 1.9 มันจะกลับมา'F'
klew

39

มันเป็นข้อตกลงใน Ruby ที่เมธอดที่ส่งคืนค่าบูลีนสิ้นสุดในเครื่องหมายคำถาม ไม่มีอะไรสำคัญไปกว่านี้อีกแล้ว


28

ในตัวอย่างของคุณเป็นเพียงส่วนหนึ่งของชื่อวิธีการ ใน Ruby คุณสามารถใช้เครื่องหมายอัศเจรีย์ในชื่อเมธอดได้!

อีกตัวอย่างของเครื่องหมายคำถามใน Ruby จะเป็นผู้ประกอบการที่สาม

customerName == "Fred" ? "Hello Fred" : "Who are you?"

13
หากต้องการขยายคำตอบของ Andy คุณจะเห็นสิ่งต่าง ๆ เช่น: customerName == user.logged_in? ? ชื่อผู้ใช้: "คุณเป็นใคร" สังเกตเครื่องหมายคำถามคู่
คำถาม

16

ในตัวอย่างของคุณ

product.valid?

valid?เป็นจริงการเรียกฟังก์ชั่นและการเรียกฟังก์ชั่นที่มีชื่อว่า ฟังก์ชัน "test for condition" / บูลีนบางประเภทมีเครื่องหมายคำถามเป็นส่วนหนึ่งของชื่อฟังก์ชันตามระเบียบปฏิบัติ


41
answer.gsub! (/ function /, 'method')
glenn jackman

15

มันอาจคุ้มค่าที่จะชี้ให้เห็นว่า?อนุญาตให้ใช้ในชื่อเมธอดไม่ใช่ตัวแปรเท่านั้น ในกระบวนการของการเรียนรู้ทับทิมฉันคิดว่าการ?กำหนดประเภทผลตอบแทนบูลีนดังนั้นฉันพยายามเพิ่มพวกเขาไปที่ตัวแปรธงนำไปสู่ข้อผิดพลาด สิ่งนี้ทำให้ฉันเชื่ออย่างผิด ๆ ไประยะหนึ่งว่ามีไวยากรณ์พิเศษบางอย่างที่เกี่ยวข้องกับ?s

ที่เกี่ยวข้อง: เหตุใดชื่อตัวแปรจึงลงท้ายด้วย `ไม่ได้" ในขณะที่ชื่อวิธีสามารถทำได้


9

ฉันเชื่อว่ามันเป็นเพียงการประชุมสำหรับสิ่งต่าง ๆ ที่บูลีน ชอบพูดว่า " IsValid"


1
ความคิดเห็นที่กระชับและยอดเยี่ยมเป็นพิเศษ "นิดหน่อยชอบพูดว่า" IsValid "
Kick Buttowski

2

มันยังใช้ในการแสดงออกปกติความหมาย "ที่ซ้ำซ้อนที่สุดของตัวละครก่อนหน้า"

ตัวอย่างเช่นนิพจน์ปกติ/hey?/ ตรงกับสตริง " he" และ " hey"


0

มันเป็นวิธีการทั่วไปที่จะใช้กับอาร์กิวเมนต์แรกของวิธีทดสอบจาก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

เท่าที่เห็นในคำถามนี้ที่นี่


3
มันไม่ได้เกี่ยวข้องกับการtest, เป็นทางลัดสำหรับ?d ใช้เวลาหนึ่งสตริงถ่านเป็นอาร์กิวเมนต์แรกของตนเพื่อให้คุณสามารถเรียกมันด้วยหรือ "d"testtest ?d, "/dev"test "d", "/dev"
bfontaine
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.