जवाबों:
नहीं नहीं। इसका उपयोग मूल्य को बूलियन में बदलने के लिए किया जाता है:
!!nil #=> false
!!"abc" #=> true
!!false #=> false
यह आमतौर पर उपयोग करने के लिए आवश्यक नहीं है, क्योंकि रूबी के लिए केवल झूठे मूल्य हैं nilऔर falseइसलिए, यह आमतौर पर उस सम्मेलन को खड़ा करने के लिए सबसे अच्छा है।
इसे जैसा समझो
!(!some_val)
एक चीज़ जो इसे वैध रूप से उपयोग की जाती है, वह डेटा के एक विशाल हिस्से को वापस लौटने से रोक रही है। उदाहरण के लिए आप शायद अपने has_image?तरीके में 3MB का इमेज डेटा वापस नहीं करना चाहते हैं , या आप अपने पूरे उपयोगकर्ता ऑब्जेक्ट को logged_in?विधि में वापस नहीं करना चाहते हैं । का उपयोग !!कर इन वस्तुओं को एक सरल true/ में परिवर्तित करता है false।
.nil?उपयोग करने के बजाय वापस क्यों नहीं !!? क्या कोई अंतर है?
!!true #=> trueऔरtrue.nil? #=> false
!!नकारात्मक बूलियन राज्य का मतलब है, दो एस कुछ भी विशेष नहीं है, एक दोहरे नकार के अलावा।
!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एक ही समान प्रवाह है, लेकिन कुछ लोग इसे स्पष्ट रूप से एक बूलियन वापस करने के लिए उपयोगी पाते हैं।
title सकते , साथ ही साथ निकटतम काम भी कर सकते हैं ... मुझे लगता है
ध्यान दें कि यह मुहावरा अन्य प्रोग्रामिंग भाषाओं में भी मौजूद है। C में एक आंतरिक boolप्रकार नहीं था , इसलिए सभी बूलियनों को intइसके बजाय टाइप किया गया, जिसमें 0या उसके विहित मूल्य थे 1। इस उदाहरण को लेते हैं (स्पष्टता के लिए जोड़ा गया कोष्ठक):
!(1234) == 0
!(0) == 1
!(!(1234)) == 1
"नॉट-नॉट" सिंटैक्स किसी भी गैर-शून्य पूर्णांक को 1कैनोनिकल बूलियन सही मान में परिवर्तित करता है ।
सामान्य तौर पर, हालांकि, मुझे इस असामान्य मुहावरे का उपयोग करने की तुलना में एक उचित तुलना में करना बेहतर लगता है:
int x = 1234;
if (!!x); // wtf mate
if (x != 0); // obvious
यदि आपको कोई विशेष या करने की आवश्यकता है तो यह उपयोगी है । मामूली संशोधनों के साथ मैट वान हॉर्न के जवाब से नकल:
1 ^ true
TypeError: can't convert true into Integer
!!1 ^ !!true
=> false
मैंने इसका उपयोग यह सुनिश्चित करने के लिए किया कि दो चर या तो दोनों शून्य थे, या दोनों शून्य नहीं थे।
raise "Inconsistency" if !!a ^ !!b
यह "दोहरा-नकारात्मक" है, लेकिन अभ्यास को हतोत्साहित किया जा रहा है। यदि आप रूबोकॉप का उपयोग कर रहे हैं , तो आप देखेंगे कि यह इस तरह के कोड के साथ शिकायत करता हैStyle/DoubleNegation उल्लंघन ।
तर्क कहता है:
यह दोनों गुप्त और आमतौर पर अनावश्यक है, यह बचा जाना चाहिए [तो टीका:] बदलें
!!somethingकरने के लिए!something.nil?
!!false # => falseजबकि!false.nil? # => true
!(foo.nil? || foo == false)- अधिक क्रिया, हां, लेकिन कम गूढ़।
यह समझना कि यह कैसे काम करता है उपयोगी हो सकता है यदि आपको एक बूलियन में एक गणना करने, कहने की आवश्यकता है। मेरे पास कोड है जो बिल्कुल 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.
प्रभावी रूप से बैंगबैंग ऑपरेटर वह बन गया है जो मैंने अन्यथा to_bool नामक एक विधि के रूप में लिखा हो सकता है।