2011-12-16 9 views
6

मैं एक ही समय में रूबी और आरओआर सीख रहा हूं और किसी और के कोड में एक चीज़ देखी है। कभी-कभी मैं इन दोनों स्पष्ट रूप से थोड़ा अलग तरीकों से परिभाषित विधियों को देखता हूं:क्या 'def self.myMethod` और' def myMethod` 'के बीच कोई अंतर है?

class SomeClass < SomeInheritance::Base 

    def self.myMethod 
    end 

    def myOtherMethod 
    end 

end 

क्या इससे कोई फर्क पड़ता है? मेरा मतलब है, क्या विधि परिभाषा में self का उपयोग विधि के तरीके को प्रभावित करता है? किसी भी ज्ञान का स्वागत है।

+0

नाप, स्वयं। यह एक वर्ग स्तर की विधि बनाता है जबकि स्वयं के बिना, यह एक उदाहरण विधि है। तो 'स्वयं' किसी को SomeClass.myMethod के रूप में बुलाया जा सकता है जबकि दूसरे को SomeClass – aishwarya

+3

का उदाहरण चाहिए, मैं आपको http://scotland-on-rails.s3.amazonaws.com/2A04_DaveThomas-SOR.mp4 – cristian

+0

@ ऑक्टोपस-पॉल देखने के लिए अनुशंसा करता हूं लिंक – marcio

उत्तर

20

def self.method_name एक उदाहरण विधि के बजाय एक वर्ग विधि परिभाषित करेगा - के रूप में होगा

class << self; def foo; end; end

विषय पर एक अच्छा पोस्ट Yehuda से this post है Katz

उदाहरण के लिए :

class Foo 
    def method_1 
     "called from instance" 
    end 

    def self.method_2 
     "called from class" 
    end 

    class << self 
     def method_3 
     "also called from class" 
     end 
    end 
end 

> Foo.method_1 
NoMethodError: undefined method 'method_1' for Foo:Class 

> Foo.method_2 
=> "called from class" 

> Foo.method_3 
=> "also called from class" 

> f = Foo.new 
=> #<Foo:0x10dfe3a40> 

> f.method_1 
=> "called from instance" 

> f.method_2 
NoMethodError: undefined method 'method_2' for #<Foo:0x10dfe3a40> 

> f.method_3 
NoMethodError: undefined method 'method_3' for #<Foo:0x10dfe3a40> 
+0

तो 'method_2' और' method_3' स्थिर विधियों की तरह हैं? – marcio

+2

+1 अच्छा जवाब: एक उदाहरण स्पष्टीकरण के 1000 शब्दों के लायक है। – wallyk

+1

@marcioAlmada - यह एक स्थिर विधि की तरह व्यवहार करता है। फू एक ऑब्जेक्ट है (बस f की तरह), और method_2 फ़ूज़ (मेटा) कक्षा में परिभाषित एक विधि है। एक बेहतर स्पष्टीकरण के लिए लिंक्ड पोस्ट पढ़ें। – klochner

1

यदि आप इस कोड को आजमाते हैं:

class SomeClass 
    p self 
end 

आपको 'SomeClass' मुद्रित किया जाएगा। ऐसा इसलिए है क्योंकि self कुछ क्लास ऑब्जेक्ट को संदर्भित करता है (हाँ, क्लूज भी रूबी में ऑब्जेक्ट्स हैं)।

स्वयं के साथ, आप (हालांकि यह वास्तव में वस्तु की metaclass में परिभाषित किया गया है ...) एक class_method वर्ग वस्तु पर एक विधि को परिभाषित कर सकते हैं, यानी :

class SomeClass 
    def self.class_method 
    puts "I'm a class method" 
    end 

    def instance_method 
    puts "I'm an instance method" 
    end 
end 

SomeClass.class_method # I'm a class method 

काफी रूबी के बारे में पता करने के लिए और भी है ऑब्जेक्ट मॉडल डेव थॉमस ने इस विषय पर एक उत्कृष्ट बात की - यह देखने के लिए @ ऑक्टोपस-पॉल लिंक को देखें।

+0

पहले से ही जानता था कि 'स्वयं' अन्य भाषाओं से 'इस' की तरह था, बस यह नहीं पता था कि इसका उपयोग वर्ग विधियों (अन्य भाषाओं में स्थिर विधियों के बराबर) घोषित करने के लिए किया गया था। +1 – marcio

+0

@marcioAlmada 'self' वास्तव में संदर्भ के आधार पर अपना अर्थ बदलता है :) - एक बार जब आप 'स्वयं' समझते हैं, तो आप रूबी ऑब्जेक्ट मॉडल को समझते हैं ... – maprihoda

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