2012-08-22 20 views
12

को संदर्भित करता है क्या रूबी में एक विधि है जो कक्षा के वर्तमान उदाहरण को संदर्भित करती है, जिस तरह से self कक्षा को संदर्भित करता है?रूबी विधि जैसे 'स्वयं' जो उदाहरण

+5

'स्वयं' * करता है * उदाहरण का संदर्भ लें। क्या आपके पास ठोस उदाहरण है? –

उत्तर

40

self हमेशा एक उदाहरण को संदर्भित करता है, लेकिन एक वर्ग स्वयं Class का उदाहरण है। कुछ संदर्भों में self इस तरह के एक उदाहरण का उल्लेख करेंगे।

class Hello 
    # We are inside the body of the class, so `self` 
    # refers to the current instance of `Class` 
    p self 

    def foo 
    # We are inside an instance method, so `self` 
    # refers to the current instance of `Hello` 
    return self 
    end 

    # This defines a class method, since `self` refers to `Hello` 
    def self.bar 
    return self 
    end 
end 

h = Hello.new 
p h.foo 
p Hello.bar 

आउटपुट:

Hello 
#<Hello:0x7ffa68338190> 
Hello 
+1

इस पर लेने के लिए खेद है, लेकिन उस पहले 'पी स्वयं' वास्तव में कक्षा परिभाषा को पार्स किए जाने पर निष्पादित करता है। 'H = Hello.new' वास्तव में वही मान वापस 'h.foo' के रूप में वापस कर देगा। मैं इस बात का जिक्र करता हूं कि सूचीबद्ध आउटपुट कुछ नए रूबीस्ट को गुमराह कर सकता है। – lilole

5

एक वर्ग self का एक उदाहरण विधि के भीतर है कि उदाहरण के लिए संदर्भित करता है। एक उदाहरण के भीतर कक्षा प्राप्त करने के लिए आप self.class पर कॉल कर सकते हैं। यदि आप कक्षा विधि के भीतर self पर कॉल करते हैं, तो आपको कक्षा मिलती है। कक्षा विधि के अंदर आप कक्षा के किसी भी उदाहरण तक नहीं पहुंच सकते हैं।

3

self संदर्भ हमेशा उपलब्ध है, और जिस वस्तु को इंगित करता है वह संदर्भ पर निर्भर करता है।

class Example 

    self # refers to the Example class object 

    def instance_method 
    self # refers to the receiver of the :instance_method message 
    end 

end 
+0

क्लास विधियों को न भूलें – ahnbizcad

2

विधि self उस ऑब्जेक्ट को संदर्भित करता है जो यह संबंधित है। कक्षा परिभाषाएं वस्तुएं भी हैं।

आप self अंदर वर्ग परिभाषा यह वर्ग परिभाषा (वर्ग के लिए) की वस्तु को संदर्भित करता है का उपयोग करते हैं, यदि आप इसे वर्ग विधि के अंदर फोन इसे फिर से वर्ग को दर्शाता है।

लेकिन उदाहरण विधि में यह उस वस्तु को संदर्भित करता है जो कक्षा का एक उदाहरण है।

1.9.3p194 :145 >  class A 
1.9.3p194 :146?>   puts "%s %s %s"%[self.__id__, self, self.class] #1 
1.9.3p194 :147?>   def my_instance_method 
1.9.3p194 :148?>    puts "%s %s %s"%[self.__id__, self, self.class] #2 
1.9.3p194 :149?>    end 
1.9.3p194 :150?>   def self.my_class_method 
1.9.3p194 :151?>    puts "%s %s %s"%[self.__id__, self, self.class] #3 
1.9.3p194 :152?>   end 
1.9.3p194 :153?>  end 
85789490 A Class 
=> nil 
1.9.3p194 :154 > A.my_class_method #4 
85789490 A Class 
=> nil 
1.9.3p194 :155 > a=A.new 
=> #<A:0xacb348c> 
1.9.3p194 :156 > a.my_instance_method #5 
90544710 #<A:0xacb348c> A 
=> nil 
1.9.3p194 :157 > 

आप कक्षा 1 घोषणा के दौरान निष्पादित # 1 देखते हैं। यह दिखाता है कि class A आईडी == 85789490 के साथ प्रकार वर्ग का एक वस्तु है। तो वर्ग घोषणा के भीतर स्वयं वर्ग को संदर्भित करता है।

तब कक्षा विधियों को लागू किया जाता है (# 4) self कक्षा विधि (# 2) के अंदर फिर से उस वर्ग को संदर्भित करता है।

और जब एक इंस्टेंस विधि लागू की जाती है (# 5) यह दिखाती है कि इसके अंदर (# 3) self क्लास इंस्टेंस के ऑब्जेक्ट को संदर्भित करता है जिस पर विधि संलग्न है।

आप एक उदाहरण विधि के अंदर वर्ग उल्लेख करने के लिए उपयोग करने की जरूरत है self.class

1

हो सकता है आप की जरूरत: ही विधि?

1.itself => 1 
'1'.itself => '1' 
nil.itself => nil 

इस सहायता की आशा करें!

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