2012-03-20 13 views
8

Próbuję nauczyć się tworzyć program wieloplatformowy w ruby. Zakodowałem klasę Engine i kilka innych klas, takich jak miasto, ulica itp. I mam problem z przekazaniem nazwy klasy jako zmiennej do innych klas. Poniższy kod zgłasza błąd: "City.rb: 15: in 'intro': niezdefiniowana lokalna zmienna lub gra metod 'dla # (NameError)". W pewnym sensie rozumiem problem, ale nie sądzę, żeby to miasto musiało wiedzieć cokolwiek o obiekcie gry , myślę, że musi go tylko zdobyć i przekazać. Ale wydaje mi się, że mam nieporozumienie dotyczące przekazywania zmiennych (zwłaszcza nazwy klasy) między klasami. Co jest nie tak w moim projekcie?Jak przekazać nazwę klasy jako zmienną innej klasie ruby?

#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

Nie widzę, gdzie podajesz nazwę klasy tutaj. –

+0

Napraw też swoje nazewnictwo. Powinny to być 'city.rb' i' game.rb' (nazwy plików - snake_case, nazwy klas - PascalCase). –

+0

Dzięki za cynk. Próbowałem przekazać nazwę klasy jako engine na game.rb # 6 jako self i na game.rb # 9 jako zmienny silnik. To jest prawdopodobnie miejsce, w którym się mylę. Czy możesz dać mi solidny przykład na to, jak przekazać nazwę klasy innej klasie, zupełnie niezależnie od mojego przykładu? – barerd

Odpowiedz

15

można przekazać w klasie jako parametr jak zwykle:

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

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

Jednak Twój błąd nie jest związany z tym. Zasadniczo próbujesz użyć obiektu game w zakresie klasy, ale jeszcze tam nie istnieje.

Aby przekazać odwołanie do instancji grę na mieście klasowej, można zrobić coś takiego:

@city = City.new(city_name, self) 

i modyfikować konstruktora City do

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

Następnie, Miasto # Intro by ma:

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

Prawdopodobnie wystąpią inne błędy, ponieważ @street nie jest definitywny w mieście, ale to już inna sprawa.

+0

Kiedy patrzę na ten problem w ten sposób, brzmi to bardzo logicznie i łatwo. Jak wspomniałem, mam bardzo stromą krzywą uczenia się dla przekazywania parametrów, czy to dla metod czy klas. Czytałem i nadal czytam tutoriale o tym, ale za każdym razem robię błędy. Czy mógłbyś wskazać mi dobry dokument o przekazywaniu parametrów lub orientacji obiektowej, aby samemu znaleźć, jak należy zdefiniować @street w mieście. – barerd

+0

\ @ nazwa_var to zmienne klasy/członkowie/pola. Zobacz, w jaki sposób @city_name została zainicjowana. Oto [samouczek] (http://juixe.com/techknow/index.php/2007/01/22/ruby-class-tutorial/) na zajęciach z ruby. – Candide

+0

Przeczytałem wcześniej ten samouczek. Powiem tak: jak mogę odnieść się do obiektu klasy B w innym obiekcie klasy A, podczas gdy ani A, ani B nie dziedziczą się od siebie nawzajem? Kiedy jeden z nich dziedziczy, mogę to zrobić.Nadal pracuję z pierwszą częścią twojego kodu (myclass) i piszę ten komentarz, aby nie była to zbyt późna odpowiedź, przepraszam. – barerd

Powiązane problemy