干净的方式来要求非Rails Ruby应用程序中的所有文件?

Jon*_*Jon 4 ruby require

我正在尝试用Ruby(而不是Rails)编写游戏,以此作为一种更好地教给自己的方法.(意思是,我想这样做是正确的,但是如果我想要窃取一些不能用于Ruby的东西,我会切换语言.)我遇到了一个需要命令的问题,而我我想知道是否有一个干净的方法来做以下事情.

到目前为止,这是我的结构:

game
  Gemfile
  src
    models
      character.rb
      game_object.rb
  init.rb
Run Code Online (Sandbox Code Playgroud)

init.rb不需要单独列出每个文件,而是需要这样的文件:

  Dir['./src/**/*.rb'].each do |app|
    require app
  end
Run Code Online (Sandbox Code Playgroud)

到目前为止,game_object.rb非常简单,但是character.rb看起来像这样:

module Game
  class Character < Game::GameObject
    attr_accessor :name

    def initialize(name)
      @name = name
      end
  end
end
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果我这样做,我得到"未初始化的常量Game :: GameObject(NameError)",除非我在其他文件之前明确要求game_object.

在我看来,我有几个选择:

  1. 在init.rb之前加载game_object(和其他superclassees).
  2. 在character.rb中需要game_object,这似乎有问题,因为根据我使用的路径,我的理解是它可能会多次加载文件.
  3. 单独加载每个文件并完全手动管理订单,这样我就可以完全控制.

这些似乎都比它应该更复杂.有更干净的方式吗?

Dan*_*ail 5

把它放在那里:更多的代码并不意味着"脏",就像更少的代码并不意味着"干净"一样.

从长远来看,手动需要你的文件会让你不那么头疼 - 它解决了加载订单问题,并防止你需要你实际上不需要的文件.此外,稍后查看您的代码的任何人都可以清楚地看到应用程序中加载的内容.

我的建议:

  1. 删除src文件夹,这是多余的 - 您的Ruby应用程序都是源代码.
  2. 将命名空间映射到文件夹
  3. 使用显式需求(当您使用#2时,这会变得更容易:

例:

game/
  bin/
    gamerunner
  Gemfile
  lib/
    game.rb
    game/
      game_object.rb
  models/
    character.rb
  spec/
    spec_helper.rb
    models/
      character_spec.rb
Run Code Online (Sandbox Code Playgroud)

你正在编写规格/测试,不是吗?

然后,在lib/game.rb:

require 'game/game_object.rb'
# require the rest of your library as you build it

module Game
end
Run Code Online (Sandbox Code Playgroud)

在你的init:

require 'game'
require 'models/character.rb'
Run Code Online (Sandbox Code Playgroud)

更清洁,更容易从以后提取,应该解决您的问题.