2010-10-22 10 views
74

संभव डुप्लिकेट:
What does !! mean in ruby?रूबी, !! ऑपरेटर (एक/k/एक डबल धमाका)

हाय,

मैं रूबी के लिए नया हूँ और कहीं भी नहीं मिल सकता है क्या वर्णन "!!" माध्यम।

यहाँ एक उदाहरण है:

def signed_in? 
    !!current_user 
end 

यदि यह एक डबल नकारात्मक, क्यों कहने के लिए नहीं है:

def signed_in? 
    current_user 
end 

कृपया मदद करते हैं।

+0

क्या आपने प्रश्नों को देखा, जो आपको प्रश्न के शीर्षक टाइप करने के बाद दिया गया था? – Nakilon

+4

हाँ, वहां कुछ भी नहीं था। मुझे वास्तव में दूसरा सवाल बताते हुए एक ही सवाल मिला, लेकिन मुझे "डबल बैंग" से खोजना पड़ा जो कि आप सोच सकते हैं उतना स्पष्ट नहीं है। – Vitaly

+3

हाँ, इसी तरह के प्रश्न एल्गोरिदम आसानी से धोखा दिया जाता है जब शीर्षक के महत्वपूर्ण भाग विराम चिह्न हैं। – pkaeding

उत्तर

98

रूबी सहित अधिकांश प्रोग्रामिंग भाषाओं, में, ! संकार्य के बूलियन मान के विपरीत वापस आ जाएगी। तो जब आप एक साथ दो विस्मयादिबोधक चिह्नों को चेन करते हैं, तो यह मान को बुलियन में बदल देता है।

121

रूबी (और कई अन्य भाषाओं) में बहुत सारे मूल्य हैं जो एक बुलियन संदर्भ में true का मूल्यांकन करते हैं, और एक मुट्ठी भर जो झूठी मूल्यांकन करेगा। रुबी में, the only two things that evaluate to false are false (itself) and nil

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

उदाहरण के लिए:

"hello" #-> this is a string; it is not in a boolean context 
!"hello" #-> this is a string that is forced into a boolean 
      # context (true), and then negated (false) 
!!"hello" #-> this is a string that is forced into a boolean 
      # context (true), and then negated (false), and then 
      # negated again (true) 
!!nil  #-> this is a false-y value that is forced into a boolean 
      # context (false), and then negated (true), and then 
      # negated again (false) 

अपने उदाहरण में, signed_in? विधि (के रूप में ? चरित्र द्वारा सम्मेलन द्वारा इंगित) एक बूलियन मान लौटना चाहिए। इस मान को तय करने के लिए उपयोग किए जाने वाले आंतरिक तर्क यह देखने के लिए जांच कर रहे हैं कि current_user चर सेट है या नहीं। यदि यह सेट है, तो यह एक बूलियन संदर्भ में true का मूल्यांकन करेगा। यदि नहीं, तो यह गलत के रूप में मूल्यांकन करेगा। दोहरी अस्वीकृति वापसी मूल्य को बूलियन होने के लिए मजबूर करता है।

+0

तो! "" ** ** ** ** ** ** ** ** ** ** ** ** पर बल ** ** है या खाली स्ट्रिंग भी सच है? – berto77

+1

'!" "' 'False 'है, क्योंकि केवल झूठी-वाई मान' झूठी 'और' शून्य' हैं। बाकी सब कुछ सत्य है- y: http://phrogz.net/ProgrammingRuby/language.html#truthvalues ​​मैंने इसे और अधिक स्पष्ट करने के लिए अपना उत्तर संपादित कर दिया है। – pkaeding

+2

यह बेहतर जवाब है क्योंकि यह बताता है कि क्यों। ऐसा लगता है कि जावा में आप उसी प्रकार के हैक को कभी-कभी एक स्ट्रिंग में एक स्ट्रिंग में परिवर्तित करने के लिए कहते हैं (जिस तरह से मैं वकालत नहीं कर रहा हूं - मुझे विश्वास है कि यह जावा में खराब अभ्यास है)। यह देखते हुए कि जावा में यह खराब प्रथा है, मुझे समझ में नहीं आता कि रूबी जैसी भाषाएं इसे क्यों गले लगा रही हैं। कम से कम वर्णों का उपयोग करने के लिए सबकुछ संभव है? –

27

!! सिर्फ ! (बूलियन निषेध ऑपरेटर) दो बार लिखा गया है। यह तर्क को अस्वीकार कर देगा, फिर अस्वीकार को अस्वीकार कर देगा। यह उपयोगी है क्योंकि आप किसी भी मूल्य से बूलियन प्राप्त करने के लिए इसका उपयोग कर सकते हैं। पहला ! तर्क को बुलियन में परिवर्तित करेगा, उदा। true यदि यह nil या false है, और false अन्यथा। दूसरा यह है कि फिर से नकारना ताकि आप और बस के बारे में सब कुछ के लिए nil या false, true के लिए तर्क की बूलियन मान, false मिल जाएगा।

रूबी में आप एक if बयान करता है, उदा में किसी भी मूल्य का उपयोग कर सकते if current_user निष्पादित करेगा यदि वर्तमान उपयोगकर्ता nil नहीं है। अधिकांश समय यह बहुत अच्छा है क्योंकि यह हमें स्पष्ट परीक्षण टाइप करता है (जैसे if !current_user.nil?, जो कम से कम छह वर्ण लंबा है)। लेकिन कभी-कभी यह वास्तव में भ्रमित हो सकता है यदि आप किसी वस्तु को वापस करते हैं जब विधि का तात्पर्य है कि यह एक बूलियन लौटाता है। जिन तरीकों का नाम ? के साथ समाप्त होता है, उन्हें सच्चाई या झूठी मान वापस करनी चाहिए, यानी वे कुछ ऐसा लौटाते हैं जो true या false का मूल्यांकन करेगा। हालांकि, अगर signed_in? उपयोगकर्ता ऑब्जेक्ट लौटाता है तो यह वास्तव में गन्दा हो सकता है।उदाहरण के लिए यदि आप डीबग करने का प्रयास कर रहे हैं तो signed_in? का उपयोग करने वाला कुछ कोड काम नहीं करता है, तो जब आप उपयोगकर्ता ऑब्जेक्ट को true या false की अपेक्षा करते हैं तो आप वास्तव में उलझन में आ जाएंगे। उस स्थिति में return से पहले !! जोड़ने के लिए उपयोगी है क्योंकि यह गारंटी है कि सच्चाई या गलत मूल्य true या false के रूप में वापस किया जाएगा।

3

जैसा कि आप सही ढंग से समझ गए हैं कि यह ! ऑपरेटर का डबल-नकारात्मक उपयोग है। ऐसा कहा जाता है, जबकि यह जांचने का एक शॉर्टेंड तरीका हो सकता है कि कोई चर शून्य हो सकता है या नहीं, आईएमओ बहुत संक्षिप्त है। this और this पोस्ट पर एक नज़र डालें। ध्यान दें कि रूबी में, शून्य के लिए कुछ परीक्षण करने से झूठी गणना होगी।

संबंधित मुद्दे