0

我有一个 jruby rails 应用程序,它在 lib 中有一个 ruby​​ 模块,它对我的​​ java 对象进行命名,所以我没有冲突。

我想知道在该模块中包含特定类和包含包之间有什么区别。我在下面包含了示例代码。

在控制台中,例如 1当我说 MyMod:: 并点击选项卡时,它具有(例如)101 个方法和类选项,其中 MyMod::MyClass 是其中之一。

例如2,当我点击 MyMod:: 和选项卡时,它只有 100 个方法/类选项,并且不包含 MyClass。如果我然后去引用 MyMod::MyClass,然后再次运行该 MyMod:: 选项卡,我现在有 101 个选项,并且列出了 MyClass。

这是我的问题。在我的模块 à la示例 1中立即引用这些类与让它们像示例 2那样按需加载有什么区别。如果我有一个包含大约 20 个类的包,我希望它们是按需加载还是预先加载,并且按需加载是否有任何开销,例如示例 2

示例代码:

示例 1

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

示例 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 回答