2011-01-17 19 views
19

संभव डुप्लिकेट:
What is the difference between include and extend in Ruby?रूबी में "मॉड्यूल शामिल करें" और "मॉड्यूल का विस्तार" के बीच क्या अंतर है?

को देखते हुए:

module my_module 
    def foo 
    ... 
    end 
end 

प्रश्न 1

क्या बीच का अंतर है:

class A 
    include my_module 
end 

और

class A 
    extend my_module 
end 

प्रश्न 2

विल foo एक उदाहरण विधि या एक वर्ग विधि पर विचार किया?

class A 
    def foo 
    ... 
    end 
end 

या करने के लिए:

class A 
    def self.foo 
    ... 
    end 
end 

दूसरे शब्दों में, यह बराबर है?

उत्तर

25

मैंने इस ब्लॉग के बारे में बहुत समय पहले पोस्ट किया था here

जब आप एक मॉड्यूल "समेत" होते हैं, तो मॉड्यूल को शामिल किया जाता है जैसे कि उन वर्गों में विधियों को परिभाषित किया गया था, आप कह सकते हैं कि यह कक्षा सहित विधियों की प्रतिलिपि बना रहा है।

जब आप एक मॉड्यूल "विस्तार" कर रहे हैं, तो आप कह रहे हैं "इस मॉड्यूल के तरीकों को पर जोड़ें इस विशिष्ट उदाहरण"। आप एक वर्ग परिभाषा के अंदर कर रहे हैं और कहते हैं कि "विस्तार" जब "उदाहरण" वर्ग वस्तु ही है, लेकिन आप भी कुछ इस तरह (ऊपर अपने ब्लॉग पोस्ट में के रूप में) कर सकता है:

module MyModule 
    def foo 
    puts "foo called" 
    end 
end 

class A 
end 

object = A.new 
object.extend MyModule 

object.foo #prints "foo called"  

तो, यह है वास्तव में एक वर्ग विधि नहीं है, लेकिन "उदाहरण" के लिए एक विधि जिसे आपने "विस्तार" कहा है। जैसा कि आप इसे कक्षा परिभाषा के अंदर कर रहे हैं और वहां का उदाहरण कक्षा है, यह एक वर्ग विधि जैसा दिखता है।

14

1) include कक्षा A के उदाहरणों पर विधियों, स्थिरांक और चर जोड़ता है; extend उन चीजों को Class उदाहरण A (प्रभावी ढंग से कक्षा विधियों को परिभाषित करने) के उदाहरण में जोड़ता है।

include my_module इस अनुमति देगा: A.new.foo

extend my_module इस अनुमति देगा: A.foo

आम तौर पर, include केवल एक Class या Module पर समझ में आता है, extend किसी भी Object करने के तरीकों को जोड़ने के लिए इस्तेमाल किया जा सकता है।

2) प्रभाव में: जब include का उपयोग कर, fooA ... का एक उदाहरण विधि है जब extend का उपयोग कर, foo एक वर्ग विधि है।

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