0

私は、libにrubyモジュールを備えたjruby railsアプリを持っています。これは、Javaオブジェクトの名前の間隔を空けているため、競合は発生しません。

そのモジュールに特定のクラスを含めることと、パッケージを含めることの違いは何だろうと思います。以下にサンプルコードを含めました。

コンソールでは、たとえば1 MyMod ::と言ってタブを押すと、(たとえば)101個のメソッドとクラスオプションがあり、MyMod::MyClassがその1つです。

たとえば、2、MyMod :: and tabを押すと、100個のメソッド/クラスオプションしかなく、MyClassは含まれていません。次に、MyMod :: MyClassに移動して参照し、そのMyMod ::タブを再度実行すると、101個のオプションがあり、MyClassが一覧表示されます。

これが私の質問です。例1のモジュールでこれらのクラスをすぐに参照することと、例2のようにオンデマンドでロードすることの違いは何ですか。使用するクラスが約20個あるパッケージがある場合、それらをオンデマンドまたは事前にロードすることをお勧めします。これをオンデマンドでロードするためのオーバーヘッドはありますか(例2 )。

サンプルコード:

例1

module MyMod
  MyClass = Java::my.package.MyClass
  ....
end

vs 例2

module MyMod
  include_package "my.package"
end
4

2 に答える 2

1

あなたが本当にクラスを使うつもりなら、それはあなたにある時点であなたに何かを犠牲にするでしょう。具体的にロードするかオンデマンドでロードするかは関係ありません。あなたの2つの例では、を使用する場合MyClass、違いはないと思います。一方、MyClass使用されていない場合、例1は明らかに何かを無駄にしています。

また、実際にinclude_packageはパッケージ全体を取り込むわけではありませんが、クラスが必要なときに検索スコープを確立するようなものです。通常、の使用はお勧めしませんinclude_package問題については、 JRUBY-2376を参照してください。

于 2010-01-14T23:33:27.030 に答える
0

結果は少し異なります。おそらく、別のオートコンプリーターを使用していますか?

irb(main):001:0> module MyMod;MyClass = Java::JavaUtil::Date;end
=> Java::JavaUtil::Date
irb(main):002:0> module OtherMod;include_package "Java.Util";end
=> nil
irb(main):003:0> MyMod.methods.size
=> 109
irb(main):004:0> OtherMod.methods.size
=> 109
irb(main):005:0> require 'irb/completion'
=> true
irb(main):006:0> MyMod::
Display all 110 possibilities? (y or n)
irb(main):006:0> OtherMod::
Display all 109 possibilities? (y or n)
irb(main):006:0> OtherMod::
irb(main):007:0*

あなたの質問については、よくわかりません。しかし、推測しなければならないのであれば、ルビーは動的であるため、どちらのアプローチも前もって何もロードしないと言えます。

于 2010-01-14T23:24:26.240 に答える