来自不同班级

时间:2016-05-27 05:49:29

标签: ruby

我无法理解本书练习43中的这些代码行以艰难的方式学习Ruby 。希望有人能向我解释。

在方法play()的while循环中,如果while语句为true,则执行哪个方法? next_scene_name current_scene 只是定义了变量吗?它们是通过运行 opening_scene 方法来定义的,这是一个来自不同类(类Map)的方法,类Engine和类Map彼此没有关系(是吗?)怎么可能在class Engine在类Map中调用一个方法?

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

2 个答案:

答案 0 :(得分:0)

你的问题在同一时间非常复杂和简单。 让我们从:

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

然后我们有一个为给定实例调用公共方法的方法(在@scene_map):

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

答案 1 :(得分:0)

有两种方法和变量需要注意。

可以在不声明类实例的情况下调用

方法。

实例方法只能在类的实例上调用。

示例:

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类可以使用Car.count_all_cars_in_existence计算所有存在的汽车,但是,要调用paint_red方法,他们必须调用方法个人车。

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

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