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
作为作业的一部分,我正在尝试使用 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