首页 > 解决方案 > 当我使用 require_relative 时,Ruby 找不到类

问题描述

作为任务的一部分,我试图使用 gosu gem 来制作一个简单的蛇游戏。我被指示遵循本指南:https ://github.com/gosu/gosu/wiki/ruby-tutorial

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

未初始化的常量 Snake (NameError)

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

未初始化的常量 Game (NameError)

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

游戏.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 的,它有游戏类,并且在运行时也会启动游戏。一个叫snake.rb,它只有蛇类。一个叫做 food.rb ,它只有一个用于蛇试图捕捉的食物的食物类。蛇类继承自游戏,游戏继承自 gosu::window

标签: rubylibgosu

解决方案


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

这是由于循环依赖:

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

你必须:

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

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

# 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

推荐阅读