2012-03-20 17 views
8

में एक वर्ग के रूप में एक वर्ग के रूप में कक्षा नाम को कैसे पास करें मैं रूबी में एक बहु कक्षा कार्यक्रम बनाने के लिए सीखने की कोशिश कर रहा हूं। मैंने एक इंजन वर्ग और शहर, सड़क इत्यादि जैसे कुछ अन्य वर्गों को कोड किया और कक्षा के नाम को अन्य वर्गों के लिए एक चर के रूप में पारित करने में समस्याएं आ रही हैं। नीचे दिया गया कोड त्रुटि को फेंकता है: "City.rb: 15: 'परिचय' में: # (NameError) के लिए अपरिभाषित स्थानीय चर या विधि गेम"। मैं इस तरह से समस्या को समझता हूं, लेकिन मुझे नहीं लगता कि शहर को गेम ऑब्जेक्ट के बारे में कुछ भी पता होना चाहिए, मुझे लगता है कि इसे केवल इसे प्राप्त करना होगा और इसे वापस पास करना होगा। लेकिन जाहिर है कि कक्षाओं के बीच चर (विशेष रूप से कक्षा का नाम) को पारित करने के बारे में मुझे गलतफहमी है। मेरे डिजाइन में क्या गलत है?रूबी

#Game.rb 
require './City.rb' 
class Engine 
    def initialize(city_name, street_name, budget) 
    @city = City.new(city_name) 
    @city.read_name() 
    play(@city, :intro, self) 
    end 

    def play(place, next_step, engine) 
    while true 
     next_step = place.method(next_step).call(place, next_step, engine) 
    end 
    end 
end 

game = Engine.new("Casablanca", "Costanza Boulvard", 200) 

#City.rb 
class City 
    def initialize(city_name) 
    @city_name = city_name 
    end 

    def read_name() 
    puts <<-READ_NAME 
    You are in a city called "#{@city_name}". 
    READ_NAME 
    end 

    def intro(place, next_step, engine) 
    puts "...." 
    game.play(@street, :enter, engine) 
    end 
end 
+0

मुझे नहीं पता कि आप यहां कक्षा का नाम कहां से गुजर रहे हैं। –

+0

इसके अलावा, अपने नामकरण को ठीक करें। 'City.rb' और' game.rb' होना चाहिए (फ़ाइल नाम - सांप_case, कक्षा के नाम - पास्कलकेस)। –

+0

टिप के लिए धन्यवाद। मैंने कक्षा के नाम को इंजन.आरबी # 6 पर स्वयं के रूप में और game.rb # 9 पर परिवर्तनीय इंजन के रूप में पारित करने का प्रयास किया। यह शायद है जहां मैं गलत हूँ। क्या आप मुझे एक उदाहरण का एक ठोस उदाहरण दे सकते हैं कि कक्षा के नाम को किसी अन्य वर्ग में कैसे पारित किया जाए, पूरी तरह से मेरे उदाहरण से अलग? – barerd

उत्तर

15

आप हमेशा की तरह एक पैरामीटर के रूप में एक कक्षा में पारित कर सकते हैं:

def use_class(myclass) 
    x = myclass.new "test" 
    x.read_name 
end 

use_class(City) 
# returned -> ' You are in a city called "test".' 

हालांकि, अपने त्रुटि इस से संबंधित नहीं है। असल में, आप किसी वर्ग के दायरे में ऑब्जेक्ट game का उपयोग करने का प्रयास कर रहे हैं लेकिन यह अभी तक मौजूद नहीं है।

वर्ग शहर के खेल उदाहरण के लिए एक संदर्भ से पारित करने के लिए, आप की तरह कुछ कर सकते हैं:

@city = City.new(city_name, self) 

और

def initialize(city_name, game) 
    @city_name = city_name 
    @game = game 
    end 

तब करने के लिए शहर के निर्माता, संशोधित करने, शहर # परिचय होगा है:

@game.play(@street, :enter, @game) 

शायद, अन्य त्रुटियों हो जाएगा के बाद से @street defin नहीं है अभी तक शहर में एड, लेकिन यह एक और मामला है।

+0

जब मैं इस तरह की समस्या को देखता हूं, तो यह बहुत तार्किक और आसान लगता है। जैसा कि मैंने उल्लेख किया है, मेरे पास पास पैरामीटर के लिए बहुत सी सीखने की वक्र है, इसे विधियों या कक्षाओं के लिए करें। मैंने पढ़ा है और इसके बारे में ट्यूटोरियल पढ़ना जारी रखा है लेकिन हर बार गलतियां करते हैं। क्या आप मुझे पैरामीटर या ऑब्जेक्ट ओरिएंटेशन पास करने के बारे में एक अच्छे दस्तावेज़ पर इंगित कर सकते हैं ताकि मैं खुद से मिल सकूं, कैसे शहर में @स्ट्रीट परिभाषित किया जाना चाहिए। – barerd

+0

\ @var_name कक्षा चर/सदस्य/फ़ील्ड हैं। देखें कि कैसे @city_name intialized है। रूबी में कक्षाओं पर एक [ट्यूटोरियल] (http://juixe.com/techknow/index.php/2007/01/22/ruby-class-tutorial/) है। – Candide

+0

मैंने पहले उस ट्यूटोरियल को पढ़ा था। मुझे इसे इस तरह से रखने दें: कक्षा ए के किसी अन्य ऑब्जेक्ट के अंदर कक्षा बी के किसी ऑब्जेक्ट को मैं कैसे संदर्भित कर सकता हूं, जबकि न तो ए या बी एक दूसरे से विरासत में आता है? जब उनमें से एक विरासत में मिलता है, तो मैं इसे कर सकता हूं।मैं अभी भी आपके कोड (माइक्लास) के पहले भाग के साथ काम कर रहा हूं, और इस टिप्पणी को लिख रहा हूं ताकि यह बहुत देर हो चुकी प्रतिक्रिया न हो, क्षमा करें। – barerd