2016-05-27 6 views
0

本書の練習問題43のこれらのコード行を理解するのに問題があります難しい方法でRubyを学ぼう。誰かが私にそれを説明することを願っています。別のクラスから呼び出す方法

play()メソッドのwhileループでは、whileステートメントがtrueの場合にどのメソッドが実行されていますか? Are next_scene_namecurrent_sceneただ変数が定義されていますか?そして、別のクラス(クラスマップ)のメソッドであるopening_sceneメソッドを実行することで定義されています。クラスエンジンとクラスマップは互いに関係がありません。クラスマップで?

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

あなたの前提はすべて正しいです。しかし、なぜ 'エンジン'が 'Map'のメソッドを呼び出せないようにするべきだと思いますか? 'scene_map'は初期化中に' Engine'に渡されました(別名インスタンスはエンジンに知られています)、 'opening_scene'と' next_scene'メソッドはMapクラスの 'private'ではありません。 – spickermann

+0

OK、私は別のクラスのメソッドを呼び出すことができませんでした、私はパブリックメソッドとプライベートメソッドの機能を認識していませんでした。あなたは私のために多くをクリアしました、ありがとう。 – CryptoPsyche

答えて

0

を認識するためのメソッドや変数の2つのタイプがあります。その後、我々は(@scene_mapで)指定されたインスタンスのパブリックメソッドを呼び出す方法を持っている

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

: のから始めましょう。

クラスメソッドは、クラスのインスタンスを宣言することなく呼び出すことができます。

インスタンスメソッドは、クラスのインスタンスに対してのみ呼び出すことができます。

例:ここでは

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 

、他のクラスには、たとえば、bureaucratクラスがpaint_redメソッドを呼び出すために、しかし、Car.count_all_cars_in_existenceで現存するすべての車を数えることができる、彼らはのメソッドを呼び出す必要があります個々の車。

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

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

「クラスのインスタンスを宣言せずにパブリックメソッドを呼び出すことができる」と言うとき、クラスメソッドを参照していますか?クラスメソッドはpublic/private/protectedでもかまいません。 –

0

あなたの質問は非常に複雑で簡単です。

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

'scene_map'はどのようにMapクラスのインスタンスですか? Mapクラスには 'scene_map'はありません。 Map.new()が呼び出されたときのインスタンス変数の一般的な宣言だと思っていました。 – CryptoPsyche

+0

私はこれを練習のソースで見つけました: 'a_map = Map.new( 'central_corridor'); a_game = Engine.new(a_map) 'となります。新しい 'Engine'を' Map'のインスタンスで初期化します。したがって、scene_mapは、そのインスタンスを参照する単なる変数です。 –

関連する問題