रूबी में प्रश्न चिह्न ऑपरेटर का क्या अर्थ है?


211

रूबी में प्रश्न चिह्न ऑपरेटर का उद्देश्य क्या है?

कभी-कभी ऐसा प्रतीत होता है:

assert !product.valid?

कभी-कभी यह एक ifनिर्माण में है।


2
किसी फ़ंक्शन के अंत में प्रश्न चिह्न एक ऑपरेटर नहीं है, यह एक साधारण चरित्र है। बृहदान्त्र के साथ प्रश्न चिह्न एक टर्नरी सशर्त ऑपरेटर है। प्रश्न चिह्न अपने आप में एक एकता उद्धरण संचालक है। देखें stackoverflow.com/questions/16641205/...
पुरानी प्रो

जवाबों:


296

यह एक कोड शैली सम्मेलन है; यह इंगित करता है कि एक विधि एक बूलियन मान लौटाता है।

प्रश्न चिह्न विधि नाम के अंत में एक मान्य वर्ण है।


9
धन्यवाद, लेकिन क्या इस सम्मेलन का मतलब है कि यह केवल तर्क करता है या इसके दुष्प्रभाव हो सकते हैं? यह कैसे कोड में वापसी प्रकार के साथ एक टाइप भाषाओं के आसपास हैक की तरह है अजीब बात है।
जेसन

5
यह इस मामले में कड़ाई से एक विधि नामकरण सम्मेलन है। बूलियन रिटर्न वैल्यू का कोई प्रवर्तन नहीं है। सिर्फ इसलिए कि प्रश्न चिह्न में विधि का नाम समाप्त होता है, इसका मतलब यह नहीं है कि विधि को एक बूलियन वापस करना चाहिए ... लेकिन यह निश्चित रूप से एक बूलियन वापस करना चाहिए । हालाँकि ?रूबी में कई अन्य उपयोग हैं (एक टर्नरी ऑपरेटर है, जो अपने ASCII पूर्णांक में एक चरित्र को परिवर्तित करता है test, RegEx'es में उपयोग , आदि) जिनमें से कई यहां अन्य उत्तरों में शामिल हैं।
कार्ल विल्बर

4
@ जेसन FYI, यहां तक ​​कि दृढ़ता से टाइप की गई भाषाओं में इस तरह के सम्मेलन हैं। उदाहरण के लिए, जावा तरीकों कि एक बूलियन मान लौट अक्सर लगी होती हैं में में "के रूप में है", 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

यह रूबी में एक सम्मेलन है जो एक प्रश्न चिह्न में बूलियन मूल्यों को वापस करने वाले तरीकों को समाप्त करता है। इससे अधिक महत्व की बात नहीं है।


28

आपके उदाहरण में यह विधि नाम का सिर्फ एक हिस्सा है। रूबी में आप विधि नामों में विस्मयादिबोधक बिंदुओं का भी उपयोग कर सकते हैं!

रूबी में प्रश्न चिह्न का एक और उदाहरण टर्नरी ऑपरेटर होगा।

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

13
एंडी के जवाब पर विस्तार करने के लिए आपको कुछ चीजें भी दिखाई देंगी जैसे: customerName == user.logged_in? ? user.name: "आप कौन हैं?" दोहरे प्रश्न चिह्न पर ध्यान दें
प्रश्न मार्क

16

अपने उदाहरण में

product.valid?

वास्तव में एक फ़ंक्शन कॉल है और एक फ़ंक्शन कॉल करता है जिसका नाम है valid?। कुछ प्रकार के "हालत के लिए परीक्षण" / बूलियन फ़ंक्शन में कन्वेंशन द्वारा फ़ंक्शन नाम के भाग के रूप में एक प्रश्न चिह्न है।


41
answer.gsub! (/ function /, 'Method')
ग्लेन जैकमैन

15

यह इंगित करने योग्य हो सकता है कि ?s केवल विधि नामों में अनुमत हैं, चर नहीं। रूबी सीखने की प्रक्रिया में, मैंने मान लिया कि ?एक बूलियन रिटर्न प्रकार निर्दिष्ट है इसलिए मैंने उन्हें ध्वज चर में जोड़ने की कोशिश की, जिससे त्रुटि हुई। इसने मुझे कुछ समय के लिए गलत तरीके से विश्वास दिलाया कि कुछ विशेष वाक्यविन्यास शामिल थे ?

प्रासंगिक: एक चर नाम किसी विधि नाम के साथ समाप्त क्यों नहीं हो सकता?


9

मेरा मानना ​​है कि यह केवल उन चीजों के लिए एक सम्मेलन है जो बूलियन हैं। " IsValid" कहने जैसा थोड़ा ।


1
संक्षिप्त और जबरदस्त टिप्पणी "विशेष रूप से" IsValid "कहना थोड़ा पसंद है
Buttowski

2

इसका उपयोग नियमित अभिव्यक्तियों में भी किया जाता है, जिसका अर्थ है "पूर्ववर्ती चरित्र के अधिकांश दोहराव में"

उदाहरण के लिए नियमित अभिव्यक्ति /hey?/ स्ट्रिंग्स " he" और " hey" के साथ मेल खाता है ।


0

कर्नेल # परीक्षण से परीक्षण विधि के पहले तर्क के साथ उपयोग करना भी एक सामान्य सम्मेलन है

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"testएक-चर स्ट्रिंग को इसके पहले तर्क के रूप में लेता है, इसलिए आप इसे test ?d, "/dev"या के साथ कॉल कर सकते हैं test "d", "/dev"
bfontaine
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.