2012-02-23 17 views
9

मैं जानना चाहता हूं कि रूबी मॉड्यूल के इंस्टेंस वेरिएबल कैसे कई वर्गों में व्यवहार करते हैं जो इसे 'मिश्रण' करते हैं। मैंने इसका परीक्षण करने के लिए एक नमूना कोड लिखा:क्या मॉड्यूल के इंस्टेंस वैरिएबल क्लास के बीच कक्षा के बीच साझा किया जाता है?

# Here is a module I created with one instance variable and two instance methods. 
module SharedVar 
    @color = 'red' 
    def change_color(new_color) 
    @color = new_color 
    end 
    def show_color 
    puts @color 
    end 
end 

class Example1 
    include SharedVar 
    def initialize(name) 
    @name  = name 
    end 
end 

class Example2 
    include SharedVar 
    def initialize(name) 
    @name  = name 
    end 
end 

ex1 = Example1.new("Bicylops") 
ex2 = Example2.new("Cool") 

# There is neither output or complains about the following method call. 
ex1.show_color 
ex1.change_color('black') 
ex2.show_color 

यह क्यों काम नहीं करता है? और क्या कोई बता सकता है कि @color के वास्तविक व्यवहार Example$ उदाहरणों में वास्तविक व्यवहार क्या होगा?

उत्तर

11

रूबी मॉड्यूल और कक्षाओं में, वस्तुओं रहे हैं तो यह उनके लिए उदाहरण चर सेट करने के लिए संभव है।

module Test 
    @test = 'red' 
    def self.print_test 
    puts @test 
    end 
end 

Test.print_test #=> red 

आपका गलती सोच रही है कि चर @color लिए एक ही है:

module SharedVar 
    @color 
end 

और

module SharedVar 
    def show_color 
    @color 
    end 
end 

जो नहीं है।

पहले उदाहरण में, उदाहरण चर SharedVar वस्तु के अंतर्गत आता है और दूसरे उदाहरण में उदाहरण चर अंतर्गत आता है वस्तु के लिए आप में मॉड्यूल शामिल हैं।

स्वयं सूचक द्वारा एक अन्य स्पष्टीकरण। पहले उदाहरण में स्वयं पॉइंटर मॉड्यूल ऑब्जेक्ट SharedVar पर सेट है, इसलिए टाइपिंग @color ऑब्जेक्ट SharedVar ऑब्जेक्ट का संदर्भ देगा और किसी अन्य ऑब्जेक्ट के साथ कोई कनेक्शन नहीं है। दूसरे उदाहरण में, विधि show_color को केवल कुछ ऑब्जेक्ट पर ही कहा जा सकता है, यानी ex1.show_color, इसलिए स्वयं पॉइंटर ex1 ऑब्जेक्ट को इंगित करेगा। तो इस मामले में इंस्टेंस वैरिएबल ex1 ऑब्जेक्ट का संदर्भ देगा।

+0

काफी स्पष्ट स्पष्टीकरण! तो अगर मैंने बनाया मॉड्यूल अन्य वर्ग के साथ मिश्रण के लिए है। मुझे 'इंस्टेंस वैरिएबल' को 'इंस्टेंस विधि' के अंदर परिभाषित करना चाहिए, क्या मेरी समझ सही है? – steveyang

+1

हां, बस वर्तमान स्वयं की गणना करें और फिर आप समझ सकते हैं कि आवृत्ति चर कहाँ रखा जाएगा। – megas

+1

धन्यवाद। मैं सिर्फ रूबी को सीख रहा हूं, वर्तमान में 'वर्तमान स्वयं' भाग के लिए नहीं। 'जावास्क्रिप्ट' की तुलना में अधिक सुरुचिपूर्ण भाषा लगता है। – steveyang

0

तुम एक वर्ग के लिए में एक मॉड्यूल को शामिल किया है .. तो उदाहरण चर @color का एक उदाहरण चर दोनों वर्ग example1 और Example2

तो होना चाहिए कि आप का उपयोग करने की @color चर मतलब है कि आप चाहते हैं, तो लगता है वर्ग के लिए एक वस्तु बनाने के लिए और फिर आप accesss कर सकते हैं यह

पूर्व

लिए
irb(main):028:0> ex1.change_color('black') 
=> "black" 
irb(main):029:0> ex1.show_color 
black 
irb(main):031:0> ex2.change_color('red') 
=> "red" 
irb(main):032:0> ex2.show_color 
red 
+0

यह वही है जो मैं कर रहा हूं। लेकिन 'ex1' और' ex2' दोनों में 'रंग' परिभाषित नहीं है। – steveyang

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