ruby - 当我使用 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
解决方案
发生这些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
推荐阅读
- node.js - 为什么我得到 existsSync 不是函数错误?节点.js
- python - 升级 AutoCAD 损坏的 Python 脚本
- python - 如何在 Python 中计算图像的经验累积分布(ecdf)?
- flutter - 显示两个涟漪效应的墨水瓶
- concurrency - 使用互斥锁的 while 循环参数的生命周期是多少?
- javascript - LocalStorage 没有被保存(Vanilla JS)?
- python - 将参数传递给回调
- javascript - 无法在我的 JavaScript 绘图板中更改颜色
- laravel - Laravel 将多个参数传递给控制器
- excel - 在 VBA 中行/列交叉点中的值为“是”时,将表中的行颜色变为绿色