2010-01-14 67 views
0

我有一个jruby rails应用程序与lib中的ruby模块是名称间距我的Java对象,所以我没有冲突。jruby包括java类的性能vs包括一个包

我想知道包括该模块中的具体类和包括包之间的区别是什么。我已经在下面包含了示例代码。

在控制台中,对于示例1当我说MyMod ::和hit选项卡时,它具有(例如)使用MyMod :: MyClass作为其中一个的101个方法和类选项。

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

这是我的问题。在我的模块à01 示例1中立即引用这些类别与将它们按需加载如示例2之间有什么区别。如果我有大约20类,我使用的软件包,是它优选具有他们按需加载或前面,并且没有任何开销加载此点播,点菜例2

示例代码:

例1

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

VS 例2

module MyMod 
    include_package "my.package" 
end 

回答

1

如果你真的要使用一门课,它会花费你一些东西。无论是专门加载还是按需加载都无关紧要。我想为你的两个例子,如果你使用MyClass,那么没有什么区别。另一方面,如果从未使用MyClass,那么示例1显然在浪费一些东西。

此外,include_package并不真正拉动整个包装,但有点像建立一个搜索范围,当需要一个类。一般不建议使用include_package。有关它的问题,请参阅JRUBY-2376

+0

非常感谢。我没有真正扩展或覆盖任何Java代码在我的红宝石,这是错误似乎涉及,我真的只包括包,所以我可以参考他们,虽然很好知道。 – brad 2010-01-15 14:16:58

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* 

至于你的问题,我不确定。但是如果我不得不猜测,那么就说红宝石是动态的,这两种方法都没有预先加载任何东西。

+0

我正在使用导轨控制台。我只是尝试了你的例子,创建了两个具有相同结果的rb文件,但是方法似乎没有列出该模块的可用类。下面是我的控制台一些输出 >> MyMod.methods.size => 161 >> OtherMod.methods.size => 161 >> MyMod :: 显示所有162的可能性? (y或n) >> OtherMod :: 显示全部161种可能性? (y或n) – brad 2010-01-15 14:13:06

+0

oops ...这不是格式太好,我认为你明白了>>显然是控制台提示 – brad 2010-01-15 14:14:55