web-dev-qa-db-ja.com

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

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

Javaプログラムがあります。これにはMainクラスとJavaCalculatorクラスがあります。JavaCalculatorには、

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

ここで、Rubyファイルがあります。MyProgram.rbと呼ばれます。

MyProgram.rbには、Rubyプログラムから期待できるものをすべて含めることができます。次のものが含まれていると仮定します。

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関数が実行され、値が取得されてから出力されます。
    • Rubyファイルは正常に実行されました。
  • Javaプログラムが終了します。

"JavaCalculatorのインスタンスを作成する"は完全に必要なわけではありません。 sumクラスからMain関数を実行するだけで十分です。

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


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

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

私はJavaプログラム、ある種のゲームエンジンです。しかし、私の対象読者はRubyコーダーの束です。私はしたくありません。 Javaですべてを学習させます。そのため、おそらくJavaプログラムは機能(ウィンドウを作成する能力、スプライトの表示、サウンドの再生...)そして、私の聴衆は単にRubyロジックでコーディングできます。これは基本的にジャストasks my Javaスプライトの表示やサウンドの再生などを行うエンジン。

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

8
Omega

あなたがおそらく本当に望んでいるのはJRubyです-> http://jruby.org/

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

12
Martijn Verburg

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

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_worldからJavaのgetHelloWorld命名規則に変換するのは非常に賢明です。

9
akuhn