Ruby 当我使用 require_relative 时找不到 class

Ruby can't find class when I use require_relative

作为作业的一部分,我正在尝试使用 gosu gem 制作一个简单的贪吃蛇游戏。我被指示遵循此指南:https://github.com/gosu/gosu/wiki/ruby-tutorial

我已经走得很远了,可以初始化贪吃蛇游戏了,但是把它放在 snake.rb 文件中,然后意识到它应该在 game.rb 文件中。我用 require_relative 链接到 snake.rb 并尝试创建蛇 class 的新实例,这给了我:

未初始化的常量 Snake (NameError)

我回到 snake.rb 文件并尝试从那里创建一条新蛇,就像我之前所做的那样。现在也在这个文件中,我得到:

未初始化的常量游戏(NameError)

似乎 snake.rb 找不到 game.rb,反之亦然,尽管它们在同一文件夹中并且我使用 require_relative。这是代码:

game.rb:

require 'gosu'
require_relative 'snake'

class Game < Gosu::Window
  def initialize(width, height)
    super width, height
  end
end

snake.rb(仅显示文件开头):

require 'gosu'
require_relative 'game'
require_relative 'food'

class Snake < Game
  SIZE = 20

  def initialize
    super SIZE * 20, SIZE * 20
    self.caption = '"SNAKE"'
    @x = (width / 2) - (SIZE / 2)
    @y = (height / 2) - (SIZE / 2)
    @dead = false
    @direction = nil
    @food = nil
    @snake_length = 1
    @score = 0
    @speed = 1
  end

根据我的理解,我现在应该可以使用

在 snake.rb 或 game.rb 中创建一个新的 snake 实例
Snake.new.show

但是它不起作用。有什么想法吗?

编辑:要求是游戏只包含 3 个 .rb 文件。一个叫做 game.rb 的游戏有 class 并且也在 运行 时开始游戏。一个叫 snake.rb,里面只有蛇 class。一个叫做 food.rb,它只有一种食物 class 用于蛇试图捕获的食物。蛇 class 继承自游戏,游戏继承自 gosu::window

那些 NameError 异常的发生是因为常量在实际定义之前被引用。

这是由于循环依赖:

  • game.rb 需要 snake.rb
  • snake.rb 需要 game.rb

你必须:

  • 先定义Game再定义Snake
  • 在调用 Snake.new
  • 之前定义 Snake

为了满足您的结构要求,您可以按照以下方式进行操作:

# game.rb
require 'gosu'

class Game < Gosu::Window
  def initialize(width, height)
    super width, height
  end
end

require_relative 'snake'

Snake.new.show

snake.rb中:

# snake.rb
class Snake < Game
  SIZE = 20

  def initialize
    # ...
  end
end