JRubyのクラスは定義が重いです。なぜだめですか?


jirbでこれを試してみたいです。
class java.lang.Integer
  def +(rhs)
    self.int_value() + rhs
  end
end
でもjirbはいつもself.int_を提示します。value()+rhsの行は間違っています。一体なぜですか?
私はつまりこのようにしたいだけです。
irb(main):001:0> i = java.lang.Integer.new(1) # OK
irb(main):002:0> i
=> #<Java::JavaLang::Integer:0x1fbc355 @java_object=1>
irb(main):003:0> i.java_class
=> java.lang.Integer
irb(main):004:0> i.int_value
=> 1
irb(main):005:0> i + 2     # not impl'd
=> 3                       # what I'd like to see
その結果、私は超低級なミスをしたことを発見しました。JRubyがjava.lang.Integerというタイプのアクセスを実現したのは、実際にmethod_を通じてです。missingの仕組みは、まずjavaに対してです。
メソッドを呼び出します。メソッドは存在しません。missingメカニズムは、値に変換して戻ってきます。そしてこれに対して
戻り値はそのランを呼び出します。
方法(または「lang」メッセージを送るほうがいいですか?)存在しないので、method_にあります。missingで手足を作って対応のpackageを見つけて返します。
もう一つの値をインテグメソッドに呼び出しても同じではないです。missingは対応するJava類を見つける。
jirbでこれを試してみたら、上の話が分かります。
irb(main):001:0> java
=> Java::Java
irb(main):002:0> java()
=> Java::Java
irb(main):003:0> com
=> Java::Com
irb(main):004:0> com().sun()
=> Java::ComSun
ここのjavaやcomなどは全部です。
変数ではなく、存在しない方法です。
すると、java.lang.Integerは、値を返す一連の方法で呼び出されるだけです。Java:JavaLang:IntegerこそこのJava類のJRubyにある名前です。形式は:
参照
Java:FulPackage NameInCamelCase:Class Name
この点が分かりました。上のコードを一つだけ変えたらいいです。
irb(main):001:0> class Java::JavaLang::Integer #     
irb(main):002:1>   def +(rhs)
irb(main):003:2>     self.int_value + rhs
irb(main):004:2>   end
irb(main):005:1> end
=> nil
irb(main):006:0> i = java.lang.Integer.new 2
=> #<Java::JavaLang::Integer:0x7efa96 @java_object=2>
irb(main):007:0> i + 3
=> 5
T Tという集積方法はやはりちょっとサプライズです。
でも、振り返ってみると、IronRuby/DLRのやり方はこれと表現的にはとても似ていますが、具体的なやり方は違います。JRubyは主にmethoduを通ります。missingメカニズムは、IreonRuby/dllにグローバル変数を注入することによって、Hostにシナリオの実行環境のためにSystemというNamespace Trackerタイプのグローバル変数を注入することができます。Systemの下の各クラスと各サブ名前空間を自動的に見つけることができます。私はやはりDLRをする時間がもっと多くて、IronRubyに対してもJRubyに対してより詳しいです。残念ながら、今のIronRubyは本当に「使える」まではまだまだです。
John Lamさんのブログに書いた文章です。
Dynamic Silverlight Part 3:Integrating Silverlight with AS.NET MVCには、このようなIronRubyのコードに複写する方法があります。NETの既存のタイプの使い方のシーン:
silverlight.rb:
class UIElement
  alias_method :old_render_transform_origin=,
               :render_transform_origin=

  def render_transform_origin=(point)
    self.old_render_transform_origin = Point.new(point.first, point.last)
  end
end
クラス名はUElementに直接付けられました。
UElementはSilverlight/WPFのクラスです。ここではRenderTrans formOrigin方法にadapptorを書いて、そのパラメータタイプをWPFのPointからRubyの配列に変えて、クラス全体をもっと「Ruby」にします。面白いです
もちろん前にはそれなりのrequireがあります。JRubyは適切なrequireをした後も同様の効果を達成することができます。