2016-05-27 28 views
0

Ich habe Probleme zu verstehen, diese Codezeilen in der Übung 43 des Buches Lernen Sie Ruby auf die harte Tour. Hoffte, dass jemand es mir erklären würde.Aufruf Methode aus einer anderen Klasse

In der While-Schleife der Methode play(), welche Methode wird ausgeführt, wenn die while-Anweisung wahr ist? Sind next_scene_name und current_scene nur Variablen definiert? Und sie werden durch Ausführen der opening_scene Methode, die eine Methode aus einer anderen Klasse (Klasse Map) ist, Klasse Engine und Klasse Map haben keine Beziehung zueinander (oder?) Wie könnte etwas in der Klasse Engine eine Methode aufrufen in der Klasse Karte?

class Engine 

    def initialize(scene_map) 
    @scene_map = scene_map 
    end 

    def play() 
    current_scene = @scene_map.opening_scene() 
    last_scene = @scene_map.next_scene('finished') 

    while current_scene != last_scene 
     next_scene_name = current_scene.enter() 
     current_scene = @scene_map.next_scene(next_scene_name) 
    end 

    # be sure to print out the last scene 
    current_scene.enter() 
    end 
end 

class Map 
    @@scenes = { 
    'central_corridor' => CentralCorridor.new(), 
    'laser_weapon_armory' => LaserWeaponArmory.new(), 
    'the_bridge' => TheBridge.new(), 
    'escape_pod' => EscapePod.new(), 
    'death' => Death.new(), 
    'finished' => Finished.new(), 
    } 


    def initialize(start_scene) 
    @start_scene = start_scene 
    end 


    def next_scene(scene_name) 
    val = @@scenes[scene_name] 
    return val 
    end 

    def opening_scene() 
    return next_scene(@start_scene) 
    end 
end 
+0

Ihre Annahmen sind alle korrekt. Aber warum sollte eine "Engine" nicht dazu berechtigt sein, eine Methode auf einer "Map" aufzurufen? Die 'scene_map' wurde während der Initialisierung in die 'Engine' übernommen (die Instanz ist der Engine bekannt) und die' opening_scene' und die 'next_scene' Methode sind in der Map Klasse nicht' private'. – spickermann

+0

OK, ich wusste nicht, dass ich eine Methode in einer anderen Klasse aufrufen kann, ich war mir der Funktionen für öffentliche und private Methoden nicht bewusst. Du hast viel für mich getan, danke. – CryptoPsyche

Antwort

0

Es gibt zwei Arten von Methoden und Variablen bewusst zu sein.

Klasse Methoden können aufgerufen werden, ohne eine Instanz einer Klasse zu deklarieren.

Instanz Methoden können nur für eine Instanz einer Klasse aufgerufen werden.

Beispiel:

class Car 
    @@number_of_cars_in_existence = 0 

    def self.count_all_cars_in_existence 
    @@number_of_cars_in_existence 
    end 

    def paint_red 
    @color = red 
    end 
end 

hier jede andere Klasse, sagen wir, die bureaucrat Klasse können alle Autos in Existenz mit Car.count_all_cars_in_existence zählen jedoch eine paint_red Methode aufzurufen, müssen sie die Methode der Aufruf ein individuelles Auto.

class StackOverflowPerson 
    def paint_car(car) 
    car.paint_red 
    end 
end 

trajanson = StackOverflowPerson.new 
my_car = Car.new 
trajanson.paint_car(my_car) 
+1

Beziehen Sie sich auf Klassenmethoden, wenn Sie sagen, dass öffentliche Methoden aufgerufen werden können, ohne eine Instanz einer Klasse zu deklarieren? Klassenmethoden können auch öffentlich/privat/geschützt sein. –

0

Ihre Frage ziemlich kompliziert und einfach in der gleichen Zeit. Beginnen wir von:

def initialize(scene_map) # seems like `scene_map` is an instance of class Map 
    @scene_map = scene_map 
end 

Dann haben wir Verfahren, die (bei @scene_map) für bestimmte Instanz öffentliche Methoden aufrufen:

def play() 
    current_scene = @scene_map.opening_scene() # here 
    last_scene = @scene_map.next_scene('finished') # and here 

    while current_scene != last_scene 
    next_scene_name = current_scene.enter() 
    current_scene = @scene_map.next_scene(next_scene_name) #and here 
    end 

    # be sure to print out the last scene 
    current_scene.enter() 
end 
+0

Wie ist 'scene_map' eine Instanz der Map-Klasse? Es gibt keine 'scene_map', die in der Map-Klasse erwähnt wird. Ich dachte, es ist nur eine gemeinsame Deklaration der Instanzvariable, wenn Map.new() aufgerufen wird. – CryptoPsyche

+0

Ich fand dies an der Quelle der Übung: 'a_map = Map.new ('central_corridor'); a_game = Engine.new (a_map) '. Sie initialisieren eine neue 'Engine' mit der Instanz 'Map'. So ist scene_map nur eine Variable, die auf diese Instanz verweist. –

Verwandte Themen