2

ロードするx.rbと、そのファイル内のすべてのクラスがロードされます。どのクラスが使用されているかを確認して確認し、それらのみをロードすることはできますか?

x.rb に Hello クラスと Goodbye クラスの両方が含まれており、私のプログラムが Hello クラスのみを使用していると仮定すると、Hello クラスのみをロードすることは可能ですか?

ドキュメントをチェックし、Hello クラスとそれを使用するコードのみを含む .rb を出力するスクリプトに満足しています...存在しない場合は興味深い github プロジェクトになるでしょうが、それは私のスキルセット atm ではないと思います.

4

2 に答える 2

2

クラスが独自の個別のファイルで定義されている場合、 ¹² メソッドを使用できます。autoload

autoload :Hello,   'x/hello'
autoload :Goodbye, 'x/goodbye'

と書くと、実際には定数Helloにアクセスしています。定数が定義されていない場合、自動的にファイルを要求するために使用します。Helloautoloadconst_missing

ここでもファイルを扱っていることに注意してください。の内容は、x/hello.rb単に読み取られて評価されます。そのコードは、あらゆる操作を実行できます。他のファイルにすることができrequireます。100 万の他のクラスを定義できます。

これは、ソース コードが実際には単なるテキストであるためです。これは特にインタープリター言語に当てはまります。たとえば、Java では、通常、「コンパイル ユニット」ごとに 1 つの public 型しか宣言できません。Ruby では、そのようなことはありません。


¹ Matz はこの慣習を強く思いとどまらせます

² Ruby Inside の記事autoload

于 2012-04-03T22:54:51.307 に答える
0

注:質問の一部を読み間違え、他の部分はどういうわけか私を回避しました...私は長い間マルチタスクを行っていたに違いありません。とにかく、この答えは質問の半分にしか答えず、間違っています。ただ言って。

さて、これはおそらく高価な方法ですが、次のようなものを試してください:

$ cat definer.rb
class Foo
  def greet(person)
    puts "Hello, #{person}!"
  end
end
Bar = Class.new

$ cat finder.rb
$LOAD_PATH << File.dirname "."
before = Object.constants
require 'definer'
after = Object.constants
print (before - after).join(" ")

$ cat looker.rb
differences = `ruby finder.rb`.split(" ")
puts "The following constants will be defined when finder.rb is loaded: #{differences.join(", ")}"

今、よりクリーンで方法のために、あなたはソケットを使うことができます。この例を取り上げます。

于 2012-04-03T22:52:09.263 に答える