ruby - रूबी में @@ परिवर्तनीय मतलब क्या है?




syntax instance-variables (4)

@ = इंस्टेंस वैरिएबल जहां @@ = क्लास वैरिएबल के रूप में

इंस्टेंस वैरिएबल की तरह है, जो इंस्टेंस वैरिएबल तक पहुंचने के लिए क्लास के इंस्टेंस / ऑब्जेक्ट्स के साथ साझा किया जाता है, हमें उस इंस्टेंस वैरिएबल के लिए सेटर्स और गेटर्स को परिभाषित करने की आवश्यकता होती है

जबकि वर्ग चर की तरह है, जिसे किसी वर्ग के सभी उदाहरणों / वस्तुओं के बीच साझा किया जाता है या दूसरे शब्दों में आप कह सकते हैं कि यह एक वैश्विक चर है, इसलिए वैश्विक चर को विश्व स्तर पर एक्सेस किया जा सकता है

रूबी चर के पहले संकेतों ( @@ ) से पहले क्या हैं? एक संकेत के साथ पहले एक चर के बारे में मेरी समझ यह है कि यह एक उदाहरण चर है, इस तरह PHP में:

PHP संस्करण

class Person {

    public $name;

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

रुबी समकक्ष

class Person

    def set_name(name)
        @name = name
    end

    def get_name()
        @name
    end
end

साइन @@ मतलब पर डबल क्या होता है, और यह संकेत पर एक से अलग कैसे होता है?


@ और @@ मॉड्यूल में भी एक वर्ग अलग-अलग काम करता है जब एक वर्ग उस मॉड्यूल को बढ़ाता या शामिल करता है।

तो दिया गया

module A
    @a = 'module'
    @@a = 'module'

    def get1
        @a          
    end     

    def get2
        @@a         
    end     

    def set1(a) 
        @a = a      
    end     

    def set2(a) 
        @@a = a     
    end     

    def self.set1(a)
        @a = a      
    end     

    def self.set2(a)
        @@a = a     
    end     
end 

फिर आपको टिप्पणियों के रूप में दिखाए गए आउटपुट मिलते हैं

class X
    extend A

    puts get1.inspect # nil
    puts get2.inspect # "module"

    @a = 'class' 
    @@a = 'class' 

    puts get1.inspect # "class"
    puts get2.inspect # "module"

    set1('set')
    set2('set')

    puts get1.inspect # "set" 
    puts get2.inspect # "set" 

    A.set1('sset')
    A.set2('sset')

    puts get1.inspect # "set" 
    puts get2.inspect # "sset"
end 

class Y
    include A

    def doit
        puts get1.inspect # nil
        puts get2.inspect # "module"

        @a = 'class'
        @@a = 'class'

        puts get1.inspect # "class"
        puts get2.inspect # "class"

        set1('set')
        set2('set')

        puts get1.inspect # "set"
        puts get2.inspect # "set"

        A.set1('sset')
        A.set2('sset')

        puts get1.inspect # "set"
        puts get2.inspect # "sset"
    end
end

Y.new.doit

तो उन सभी चर के लिए मॉड्यूल में @@ का उपयोग करें जिन्हें आप अपने सभी उपयोगों के लिए सामान्य चाहते हैं, और उन सभी चर के लिए मॉड्यूल में @ का उपयोग करें जिन्हें आप प्रत्येक उपयोग संदर्भ के लिए अलग करना चाहते हैं।


@ - एक वर्ग के इंस्टेंस चर
@@ - क्लास वैरिएबल, जिसे कुछ मामलों में स्थैतिक चर भी कहा जाता है

एक वर्ग परिवर्तनीय एक चर है जिसे कक्षा के सभी उदाहरणों के बीच साझा किया जाता है। इसका अर्थ यह है कि इस वर्ग से तत्काल सभी ऑब्जेक्ट्स के लिए केवल एक चर वैल्यू मौजूद है। यदि एक ऑब्जेक्ट इंस्टेंस चर के मान को बदलता है, तो वह नया मान अन्य सभी ऑब्जेक्ट उदाहरणों के लिए अनिवार्य रूप से बदल जाएगा।

कक्षा चर के बारे में सोचने का एक और तरीका एक वर्ग के संदर्भ में वैश्विक चर के रूप में है। क्लास वेरिएबल को वैरिएबल नाम को दो @ अक्षर ( @@ ) के साथ उपसर्ग करके घोषित किया जाता है। कक्षा चर को निर्माण समय पर शुरू किया जाना चाहिए


@@ एक वर्ग परिवर्तनीय को इंगित करता है, यानी इसे विरासत में प्राप्त किया जा सकता है।

इसका अर्थ यह है कि यदि आप उस वर्ग का उप-वर्ग बनाते हैं, तो यह चर का वारिस करेगा। तो यदि आपके पास क्लास वेरिएबल @@number_of_wheels साथ क्लास Vehicle तो यदि आप class Car < Vehicle बनाते हैं तो उसके पास क्लास वेरिएबल @@number_of_wheels भी होगा





class-variables