rjb project page
Rjb::primitive_conversionというモジュールの擬似属性を追加。
Rjb::primitive_conversion = true を実行すると、以降、プリミティブ型クラスのオブジェクトが戻された場合、Rubyのネイティブ型に変換します。
ぐわ、java.lang.Longを忘れてた。御指摘感謝
感激です。これから対応・速度評価・追いかけなどしてみようと思います。ありがとうございます。
geotools.rb, Rjb 1.0.7 に対応してみました。<br>java.lang.Long への対応に不具合があるようです。<br>http://d.hatena.ne.jp/hfu/20070916/11898343
すみません、上記リンク、何かおかしいようです;<br>http://d.hatena.ne.jp/hfu/20070916/<br>でお願いします。
ごめんなさい。testも含めてLongのことは完全に忘れてました。<br>rjb-1.0.8をリリースしたので試していただけますか?
rjb-1.0.8、ありがとうございます。試したところ、動作良好です。私のプログラムについては、パフォーマンスも JRuby と比較して 18% 程度良くなっています。<br>http://d.hatena.ne.jp/hfu/20070917
間が開いてしまったのですが、primitive_conversion = true モードの Rjb と異なり、JRuby では(プリミティブ型クラスに加えて) java.lang.String も Ruby::String に自動変換されるようです。JRuby との互換性を確保使用とした場合には、String の Ruby::String への自動型変換も同様に行えるようにしたほうが良いかもしれません。string_conversion = true?
RjbもJavaのStringを利用しているのは明示的にnewで作成した場合だけで、メソッドの返り値の場合はRubyのStringに変換してると思いますが、どういう場合でしょうか?
ヒントをありがとうございます。調べてみると、Java 側のメソッドで戻り値の型が java.lang.Object になっている場合には、 java.lang.String のオブジェクトがそのまま、 Ruby の String に変換されることなく返却されることが分かりました。<br><br>例えば、下記のプログラム:<br>----<br>begin<br> require 'java'<br> include_class('java.util.ArrayList')<br> l = ArrayList.new<br> l.add('string')<br> p l.get(0).class<br>rescue LoadError<br> require 'rjb'<br> ArrayList = Rjb::import('java.util.ArrayList')<br> l = ArrayList.new<br> l.add('string')<br> p l.get(0).getClass.getName<br>end<br>----<br>に対して、<br>----<br>$ jruby list_test.rb <br>String<br>$ ruby list_test.rb <br>"java.lang.String"<br>----<br>ということで、(どちらが良いかは別にして、)Rjb と JRuby の間で型変換の相違が発生しています。<br>じゃあ Date はどうなんだ・どうしてなんだ、などと疑問が湧いたりもしますが、取り急ぎ相違発生ケースを報告いたします。<br># 返却値型が CharSequence の場合も似たような相違が発生するかもしれないと思いました(が、これについては裏を取っていません...)。
あ、なるほど。了解しました。修正してみます。
ジェズイットを見習え
感激です。これから対応・速度評価・追いかけなどしてみようと思います。ありがとうございます。
geotools.rb, Rjb 1.0.7 に対応してみました。<br>java.lang.Long への対応に不具合があるようです。<br>http://d.hatena.ne.jp/hfu/20070916/11898343
すみません、上記リンク、何かおかしいようです;<br>http://d.hatena.ne.jp/hfu/20070916/<br>でお願いします。
ごめんなさい。testも含めてLongのことは完全に忘れてました。<br>rjb-1.0.8をリリースしたので試していただけますか?
rjb-1.0.8、ありがとうございます。試したところ、動作良好です。私のプログラムについては、パフォーマンスも JRuby と比較して 18% 程度良くなっています。<br>http://d.hatena.ne.jp/hfu/20070917
間が開いてしまったのですが、primitive_conversion = true モードの Rjb と異なり、JRuby では(プリミティブ型クラスに加えて) java.lang.String も Ruby::String に自動変換されるようです。JRuby との互換性を確保使用とした場合には、String の Ruby::String への自動型変換も同様に行えるようにしたほうが良いかもしれません。string_conversion = true?
RjbもJavaのStringを利用しているのは明示的にnewで作成した場合だけで、メソッドの返り値の場合はRubyのStringに変換してると思いますが、どういう場合でしょうか?
ヒントをありがとうございます。調べてみると、Java 側のメソッドで戻り値の型が java.lang.Object になっている場合には、 java.lang.String のオブジェクトがそのまま、 Ruby の String に変換されることなく返却されることが分かりました。<br><br>例えば、下記のプログラム:<br>----<br>begin<br> require 'java'<br> include_class('java.util.ArrayList')<br> l = ArrayList.new<br> l.add('string')<br> p l.get(0).class<br>rescue LoadError<br> require 'rjb'<br> ArrayList = Rjb::import('java.util.ArrayList')<br> l = ArrayList.new<br> l.add('string')<br> p l.get(0).getClass.getName<br>end<br>----<br>に対して、<br>----<br>$ jruby list_test.rb <br>String<br>$ ruby list_test.rb <br>"java.lang.String"<br>----<br>ということで、(どちらが良いかは別にして、)Rjb と JRuby の間で型変換の相違が発生しています。<br>じゃあ Date はどうなんだ・どうしてなんだ、などと疑問が湧いたりもしますが、取り急ぎ相違発生ケースを報告いたします。<br># 返却値型が CharSequence の場合も似たような相違が発生するかもしれないと思いました(が、これについては裏を取っていません...)。
あ、なるほど。了解しました。修正してみます。