2009-02-07 16 views

उत्तर

145

नहीं। यह एक बूलियन के लिए एक मूल्य कन्वर्ट करने के लिए प्रयोग किया जाता है:

!!nil #=> false 
!!"abc" #=> true 
!!false #=> false 

यह आमतौर पर है, हालांकि उपयोग करने के लिए के बाद से रूबी के लिए एक ही झूठी मान nil और false हैं आवश्यक नहीं है, तो यह है कि सम्मेलन स्टैंड जाने के लिए आमतौर पर सबसे अच्छा है। के रूप में

!(!some_val) 

एक बात यह है कि यह वैध तरीके से लौटाए जाने से डेटा की एक बड़ी हिस्सा रोक रहा है के लिए इस्तेमाल किया इसके बारे में

Think। उदाहरण के लिए आप शायद अपने has_image? विधि में 3 एमबी छवि डेटा वापस नहीं करना चाहते हैं, या आप logged_in? विधि में अपना संपूर्ण उपयोगकर्ता ऑब्जेक्ट वापस नहीं करना चाहेंगे। !! का उपयोग इन वस्तुओं को एक साधारण true/false में परिवर्तित करता है।

+3

तो यह एक डबल नकारात्मक है? – Ross

+6

इसका उपयोग करने के लिए यह एक बुरा अभ्यास नहीं है। एक स्पष्ट रूप से बुलियन मूल्य वापस करने के लिए डबल बैंग अक्सर भविष्यवाणियों (अंत में समाप्त होने वाली विधियों) में उपयोग किया जाता है। – Swanand

+6

एलेक्स, आपको बड़ी वस्तुओं को वापस करने के बारे में चिंता करने की ज़रूरत नहीं है, क्योंकि रूबी एक संदर्भ वापस करेगा, न कि ऑब्जेक्ट की एक प्रति। – DSimon

28

यह रिटर्न true अगर सही पर वस्तु nil और नहीं false, false अगर यह होता है nil या false

def logged_in? 
    [email protected]_user 
end 
+1

क्या यह स्पष्ट था कि यह Restful_Auth से आया था ?! : डी – Cameron

+0

न केवल अगर यह शून्य है। – womble

6

ध्यान दें कि यह मुहावरा के साथ-साथ अन्य प्रोग्रामिंग भाषाओं में मौजूद नहीं है। सी में एक आंतरिक bool प्रकार नहीं था, इसलिए 0 या 1 के कैनोलिक मानों के साथ, सभी बूलियन को int के रूप में टाइप किया गया था। इस उदाहरण (कोष्ठकों स्पष्टता के लिए जोड़ा) ले जाता है:

!(1234) == 0 
!(0) == 1 
!(!(1234)) == 1 

"नहीं-नहीं" वाक्य रचना 1, विहित बूलियन सही मूल्य के लिए किसी भी गैर शून्य पूर्णांक बदल देता है।

सामान्य में, हालांकि, मैं यह ज्यादा बेहतर एक उचित तुलना में डालने के लिए की तुलना में इस असामान्य मुहावरा उपयोग करने के लिए लगता है:

int x = 1234; 
if (!!x); // wtf mate 
if (x != 0); // obvious 
+0

या बस अगर (x)। !! जब आपको 0/1 प्राप्त करने की आवश्यकता होती है तो उपयोगी होता है। आप (x) पर विचार कर सकते हैं या नहीं कर सकते हैं? 1: 0 स्पष्ट। – derobert

14

! साधन नकारना बूलियन राज्य, दो ! कुछ भी नहीं विशेष, एक के अलावा अन्य है डबल अस्वीकृति

!true == false 
# => true 

यह आमतौर पर एक बूलियन लौटने के लिए एक विधि को मजबूर करने के लिए उपयोग किया जाता है। यह किसी भी प्रकार की सच्चाई का पता लगाएगा, जैसे स्ट्रिंग, पूर्णांक और क्या नहीं, और इसे एक बुलियन में बदल दें।

!"wtf" 
# => false 

!!"wtf" 
# => true 

एक और अधिक वास्तविक उपयोग के मामले:

def title 
    "I return a string." 
end 

def title_exists? 
    !!title 
end 

यह उपयोगी है जब आप यह सुनिश्चित करें कि एक बूलियन दिया जाता है बनाना चाहते हैं। IMHO यह एक प्रकार का व्यर्थ है, हालांकि, यह देखते हुए कि if 'some string' और if true सटीक समान प्रवाह है, लेकिन कुछ लोगों को यह स्पष्ट रूप से एक बूलियन लौटने के लिए उपयोगी लगता है।

+0

यह मुझे एक कथन कथन या एक टर्नरी ऑपरेटर का उपयोग करने की तुलना में बस एक तेज़ तरीका की तरह लगता है। चूंकि आप केवल 'शीर्षक' वापस नहीं कर सकते हैं, साथ ही साथ निकटतम चीज़ भी कर सकते हैं ... मुझे लगता है कि –

3

यदि आपको exclusive or करने की आवश्यकता है तो यह उपयोगी है।मामूली परिवर्तनों के साथ मैट वान हॉर्न के जवाब से प्रतिलिपि बनाई जा रही:

1^true 
TypeError: can't convert true into Integer 

!!1^!!true 
=> false 

मैं इसे इस्तेमाल किया दो चर सुनिश्चित करने के लिए या तो दोनों नहीं के बराबर है, या दोनों शून्य नहीं थे।

raise "Inconsistency" if !!a^!!b 
0

समझना यह कैसे काम करता उपयोगी हो सकता है अगर आप कन्वर्ट करने के लिए कहते हैं कि एक बूलियन में एक गणना की जरूरत है,,। मुझे लगता है कि है कि वास्तव में करता है, classy_enum मणि का उपयोग कर कोड है:

class LinkStatus < ClassyEnum::Base 
    def ! 
    return true 
    end 
end 

class LinkStatus::No < LinkStatus 
end 

class LinkStatus::Claimed < LinkStatus 
    def ! 
    return false 
    end 
end 

class LinkStatus::Confirmed < LinkStatus 
    def ! 
    return false 
    end 
end 

class LinkStatus::Denied < LinkStatus 
end 

फिर सेवा कोड में मैं है, उदाहरण के लिए:

raise Application::Error unless !!object.link_status # => raises exception for "No" and "Denied" states. 

प्रभावी ढंग से bangbang ऑपरेटर क्या मैं अन्यथा के रूप में लिखा हो सकता है बन गया है to_bool नामक एक विधि।

3

यह "डबल-नकारात्मक" है, लेकिन अभ्यास को निराश किया जा रहा है। यदि आप rubocop का उपयोग कर रहे हैं, तो आप इसे Style/DoubleNegation उल्लंघन के साथ इस तरह के कोड पर शिकायत करेंगे।

rationale कहता है:

इस रूप में दोनों गुप्त और आमतौर पर अनावश्यक है, यह से बचा जाना चाहिए है [तो टीका:] बदलें !!something!something.nil? को

+0

लेकिन ... '' '!! !! झूठी # => झूठी''' जबकि ' '' ! false.nil? # => सत्य''' – Doug

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