Javaプログラムから関数を呼び出してプリミティブ型の結果を受け取ることができるJavaでRubyファイルを実行する方法は?


8

何を求めているのかよくわかりません(笑!)。そうでない場合は、申し訳ありません。

Javaプログラムがあるとします。それは持っているMainJavaCalculator、クラスを。JavaCalculatorのようないくつかの基本的な機能があります

public int sum(int a,int b) {
   return a + b
}

今、私はルビーファイルを持っていると仮定します。と呼ばれるMyProgram.rb

MyProgram.rbルビプログラムに期待できるものをすべて含むかもしれません。次のものが含まれていると仮定します。

class RubyMain
  def initialize
    print "The sum of 5 with 3 is #{sum(5,3)}"
  end
  def sum(a,b)
    # <---------- Something will happen here
  end
end

rubyMain = RubyMain.new

良い。さて、あなたは私がしたいことをすでに疑っているかもしれません:

  • Javaプログラムを実行したい
    • Rubyファイルを実行させたいMyProgram.rb
    • Rubyプログラムが実行されると、のインスタンスが作成され、JavaCalculatorそのsum関数が実行され、値が取得されてから出力されます。
    • ルビファイルは正常に実行されました。
  • Javaプログラムが閉じます。

「のインスタンスを作成するJavaCalculatorは必ずしも必要ではありません。クラスsumから関数を実行するだけで十分Mainです。

私の質問:そのようなことは可能ですか?特定の処理を実行して結果を取得するようにJavaプログラムに命令できるRubyファイルを内部で実行するJavaプログラムを実行できますか?上記の例では、RubyファイルがJavaプログラムに合計を求めて結果を返すように要求しています。


これはばかげて聞こえるかもしれません。私はこの種のものに新しいです(可能であれば)。

なぜ私はこれを尋ねるのですか?

ある種のゲームエンジンであるJavaプログラムがあります。ただし、私の対象読者は多数のRubyコーダーです。彼らにJavaを学ばせたくありません。おそらく、Javaプログラムが単純に提供できることを考え出し、私はとても機能(ウィンドウ、表示スプライト、プレイサウンドを作成する能力を...)、その後、私の観客は単にルビーとのコードは基本的justsロジックは、でき尋ねる行うには、私のJavaエンジンをスプライトの表示やサウンドの再生など。

それは私がこれについて尋ねることについてであるときです。


1
JRubyに基づく回答を受け入れました。これは、非常に具体的な問題に対する優れた解決策です。このような状況に当てはまるより一般的な答えは他にもたくさんありますが、それらを見たい場合は、おそらく別の形式でもう一度質問する必要があります。
david.pfx 14年

回答:


12

あなたがおそらく本当に求めているのは、JRuby-> http://jruby.org/です。

JRubyは、Java仮想マシンでの完全な機能を備えた、準拠したRuby実装です。一部のRubyistによると、これは最速です(Java 7互換のVMで実行している場合)。JRubyはJavaライブラリを呼び出し、それらの呼び出しから戻り値を取得できます。つまり、両方の世界で最高の機能を利用できます。


これは有望に聞こえるかもしれませんが、JRubyのような「異なるツール」を使用せずに、現在のシナリオ(プレーンJavaとプレーンRubyがある)の解決策をいただければ幸いです。
オメガ

JRubyはJVM上でプレーンなRubyコードを実行します-開発者はまだRubyを使用できます:-)。
Martijn Verburg

JRubyを使用する方法です。
akuhn

それが何をするのか、何が良いのかについてもっと説明してもらえますか?Stack Exchange では「リンクのみの回答」はまったく歓迎されません
2013年

1
そうです-少し拡張された答え-HTH!
Martijn Verburg 2013

9

あなたは私たちを信じていないようですから。

JRubyを使用してJavaからRubyコードを実行する方法は次のとおりです。JRubyは「別のツール」ではなく、Java上でRubyを実行するために必要なJARファイルです。それはと同じくらい簡単です

package com.example;

import org.jruby.embed.LocalVariableBehavior;
import org.jruby.embed.ScriptingContainer;

public class Main {

    private ScriptingContainer ruby;

    public static void main(String[] args) {
        new Main().run();
    }

    public void run() {
        ruby = new ScriptingContainer(LocalVariableBehavior.PERSISTENT);
            // Assign the Java objects that you want to share
        ruby.put("main", this);
            // Execute a script (can be of any length, and taken from a file)
        Object result = ruby.runScriptlet("main.hello_world");
            // Use the result as if it were a Java object
        System.out.println(result);
    }

    public String getHelloWorld() {
        return "Hello, worlds!";
    }

}

ご覧のとおり、Ruby hello_worldgetHelloWorld名前付け規則からJavaの名前付け規則に変換するのは非常に賢明です。


1
それは単なるJARファイルですか?どこで見つけることができますか?
オメガ

1
jruby.org/download"JRuby 1.7.2 Complete.jar"からファイルをダウンロードします(同じページに言語のインストールがあり、開発に役立ちますが、最終的なシステムにはcomplete.jarのみが必要です)
akuhn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.