4

私はJRubyを試しています-rubyファイルからJavaを生成します。私は、Javaインターフェースを実装するrubyの抽象クラスと、これを拡張する子クラスを持っています。ルビーでも。

http://jira.codehaus.org/browse/JRUBY-6342で説明されているように、生成されたすべてのJavaファイルがRubyObjectのみを拡張するという問題が発生しています。

他の誰かがこれに遭遇し、回避策があるかどうか疑問に思っていますか?現在、抽象クラスを拡張しないため、各子クラスでjava_implementインターフェイスを使用しています。

問題を説明するJRUBY-6342のスニペットを含めました。

jrubyc --javaによって生成されたJavaコードは、Rubyクラスの継承をサポートしていないようです。次の簡単な例を考えます。

クラスAdefmy_class; self.class.name end end

クラスB<A終了

B.javaで生成されたクラスは、AではなくRubyObjectを継承し、JavaでBクラスを完全に破壊します。やや関連性のある注意点として、モジュールの組み込みも機能していないようです。インクルードMを持つクラスは、生成されたJavaコードでMのメソッドを取得しません。

RubyまたはJRubyの理解に何か欠けていますか?

4

1 に答える 1

2

jrubyコンパイラはまだクラスのRubyObjectを生成するため、これは確かにまだ問題です。

これについて私が知っている唯一の回避策はScriptEngine、JavaのJRubyを使用してJRubyコードを評価することです。たとえば、JRubyのコードは次のとおりです。

require 'java'

java_import 'javax.swing.JFrame'
java_import 'javax.swing.JButton'

class MyFrame < JFrame
  def initialize
    super('Test')
    content_pane.add(JButton.new("Hello"))
    pack()
  end
end

このコードは、次のようなJavaクラスから呼び出すことができます。

import javax.swing.JFrame;

import javax.script.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {

    ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("jruby");
        Reader reader = new FileReader("myframe.rb");
        engine.eval(reader);

        // Instantiate the JRuby class, and cast the result of eval.
        JFrame frame = (JFrame) engine.eval("MyFrame.new");
        frame.setVisible(true);
    }
}

ここで、によって返されるオブジェクトは、期待どおりにevalにキャストできます。その問題については、この質問JFrameも参照してください。

于 2012-09-06T13:17:17.723 に答える