क्या करता है !! माणिक में?


जवाबों:


161

नहीं नहीं। इसका उपयोग मूल्य को बूलियन में बदलने के लिए किया जाता है:

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

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

इसे जैसा समझो

!(!some_val)

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


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

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

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

सिर्फ .nil?उपयोग करने के बजाय वापस क्यों नहीं !!? क्या कोई अंतर है?
ashes999

3
एक मूल्य है जब आपका मूल्य एक बूलेन है। !!true #=> trueऔरtrue.nil? #=> false
एलेक्स वेन

31

यह वापस आता है trueयदि दाईं ओर की वस्तु नहीं है nilऔर नहीं है false, falseअगर यह है nilया नहींfalse

def logged_in?   
  !!@current_user
end

1
क्या यह स्पष्ट था कि यह Restful_Auth से आया है ?! : डी
कैमरून

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एक ही समान प्रवाह है, लेकिन कुछ लोग इसे स्पष्ट रूप से एक बूलियन वापस करने के लिए उपयोगी पाते हैं।


यह मेरे लिए एक तेज तर्रार बयान या टर्नरी ऑपरेटर की तुलना में सिर्फ एक तेज़ तरीका लगता है। चूंकि आप अभी नहीं लौट सकतेtitle सकते , साथ ही साथ निकटतम काम भी कर सकते हैं ... मुझे लगता है
कार्सन मायर्स

6

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

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

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

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

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

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

3

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

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

!!1 ^ !!true
=> false

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

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

3

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

तर्क कहता है:

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


1
लेकिन ... !!false # => falseजबकि!false.nil? # => true
डग

@ डॉग यदि आप जानते हैं कि आपके पास बूलियन मूल्य है, तो यह बेमानी है (केवल मूल्य का उपयोग करें)। यदि आप नहीं करते हैं, तो आप उपयोग कर सकते हैं !(foo.nil? || foo == false)- अधिक क्रिया, हां, लेकिन कम गूढ़।
डेविड मोल्स

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.

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.