1

特定のディレクトリから必要なすべての .rb ファイルをインポートするのに問題があります。この質問が多く寄せられていることは知っていますが、以前の投稿のどれも私の問題を解決していないようです。

これが私のディレクトリ構造です:

- Docs
- Lexer
- Parser
  --> Parser.rb
- SyntaxTree
  --> I want all the .rb files from here
  --> Sets.rb (Module I want to import)
      --> EMPTY_SET (constant I want to reference)
- Test
<Main Program>

私は現在 Parser.rb で作業しており、Parser.rb 内でそれらを参照できるように、SyntaxTree ディレクトリからすべての .rb ファイルを取得する必要があります。Sets.rb に含まれている Sets モジュールもインポートします。

以前の投稿のほとんどで見たすべての ruby​​ ファイルをインポートしようとする現在の方法を次に示します。

Dir['../SyntaxTree/*.rb'].each {|file| require file}

私も試しました:

Dir['../SyntaxTree/*.rb'].each {|file| require_relative file}

これらの方法のいずれかを使用しても、Sets モジュールをインクルードしようとするとエラーが発生します。

class Parser
  include Sets
  .
  .
end
`<class:Parser>': uninitialized constant Parser::Sets (NameError)

直接含めるSets.rbとエラーが消えます

どんなアイデアでも非常に役に立ちます。

4

1 に答える 1

1

最善のアプローチは、モジュール内に適切な依存関係を設定しautoloadて、必要なクラスがオンデマンドでロードされるようにすることです。を使用してすべてのファイルをロードするだけでは、ファイルrequire名に基づいてどの順序でロードする必要があるかが明確にならず、相互依存関係は解決されません。

これが、アプリケーションのトップレベルの名前空間を持つことが役立つ理由です。例:

module MyApp
  autoload(:Parser, 'my_app/parser')
  autoload(:Sets, 'my_app/sets')
end

これで、これらのクラスはオンデマンドで自動的に読み込まれるはずです。

于 2012-06-07T15:34:00.373 に答える