Wie führe ich eine Ruby-Datei in Java aus, die Funktionen aus dem Java-Programm aufrufen und Ergebnisse vom primitiven Typ empfangen kann?

8

Ich verstehe nicht ganz, was ich frage (lol!), Nun, in dem Sinne, ob es überhaupt möglich ist, das heißt. Wenn nicht, tut mir leid.

Angenommen, ich habe ein Java-Programm. Es hat eine Mainund eine JavaCalculatorKlasse. JavaCalculatorhat einige Grundfunktionen wie

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

Angenommen, ich habe eine Ruby-Datei. Angerufen MyProgram.rb.

MyProgram.rbkann alles enthalten, was Sie von einem Ruby-Programm erwarten können. Nehmen wir an, es enthält Folgendes:

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

Gut. Dann ahnen Sie vielleicht schon, was ich tun möchte:

  • Ich möchte mein Java-Programm ausführen
    • Ich möchte, dass die Ruby-Datei ausgeführt wirdMyProgram.rb
    • Wenn das Ruby-Programm ausgeführt wird, erstellt es eine Instanz von JavaCalculator, führt die sumFunktion aus, ruft den Wert ab und druckt ihn dann aus.
    • Die Ruby-Datei wurde erfolgreich ausgeführt.
  • Das Java-Programm wird geschlossen.

Hinweis : Das "Erstellen einer Instanz von JavaCalculator" ist nicht unbedingt erforderlich. Ich würde mich damit zufrieden geben, nur eine sumFunktion von beispielsweise der MainKlasse aus auszuführen .

Meine Frage: ist so etwas möglich? Kann ich ein Java-Programm ausführen, das intern eine Ruby-Datei ausführt, die das Java-Programm anweisen kann, bestimmte Dinge zu tun und Ergebnisse zu erzielen? Im obigen Beispiel fordert die Ruby-Datei das Java-Programm auf, eine Summe dafür zu erstellen und das Ergebnis anzugeben.


Das mag lächerlich klingen. Ich bin neu in solchen Dingen (wenn es möglich ist, das heißt).

Warum frage ich das?

Ich habe ein Java-Programm, das eine Art Spiel-Engine ist. Meine Zielgruppe sind jedoch einige Ruby-Codierer. Ich möchte nicht, dass sie Java lernen. Also dachte ich mir, dass das Java-Programm vielleicht einfach die Funktionalität bieten könnte (Fähigkeit, Fenster zu erstellen, Sprites anzuzeigen, Sounds abzuspielen ...), und dann kann mein Publikum einfach mit Ruby die Logik codieren, was im Grunde nur meine Java-Engine verlangt Dinge wie das Anzeigen von Sprites oder das Spielen von Sounds.

Dann habe ich darüber nachgedacht.

Omega
quelle
1
Sie haben eine Antwort auf der Grundlage von JRuby akzeptiert, die eine gute Lösung für ein ganz bestimmtes Problem darstellt. Es gibt viele andere allgemeinere Antworten, die auf diese und ähnliche Situationen zutreffen. Wenn Sie sie jedoch sehen möchten, müssen Sie die Frage jetzt wahrscheinlich erneut in einem anderen Format stellen.
david.pfx

Antworten:

12

Was Sie wahrscheinlich wirklich suchen, ist JRuby -> http://jruby.org/

JRuby ist eine voll funktionsfähige, kompatible Ruby-Implementierung auf der Java Virtual Machine. Laut einigen Rubyisten ist es auch das schnellste (vorausgesetzt, Sie arbeiten auf einer Java 7-kompatiblen VM). JRuby kann Java-Bibliotheken aufrufen und Rückgabewerte von diesen Aufrufen übernehmen. Kurz gesagt, Sie können das Beste aus beiden Welten haben.

Martijn Verburg
quelle
Obwohl dies vielversprechend klingt, würde ich eine Lösung für mein aktuelles Szenario (ich habe einfaches Java und einfaches Ruby) ohne die Verwendung eines "anderen Tools" wie JRuby begrüßen.
Omega
JRuby führt Ihren einfachen Ruby-Code auf der JVM aus - Ihre Entwickler können Ruby weiterhin verwenden :-).
Martijn Verburg
JRuby ist der richtige Weg!
Akuhn
Würde es Ihnen etwas ausmachen, mehr darüber zu erklären, was es tut und wofür es gut ist? "Nur-Link-Antworten" sind bei Stack Exchange nicht ganz willkommen
Mücke
1
Richtig, Sie sind - leicht erweiterte Antwort - HTH!
Martijn Verburg
9

Da scheinen Sie uns nicht zu glauben.

Hier erfahren Sie, wie Sie mit JRuby Ruby-Code von Java aus ausführen. JRuby ist kein „anderes Tool“, sondern nur die JAR-Datei, die Sie benötigen, um Ruby auf Java ausführen zu können. Es ist so einfach wie

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!";
    }

}

Wie Sie sehen, ist es sogar so klug, von Rubys hello_worldin Javas getHelloWorldNamenskonvention zu übersetzen .

akuhn
quelle
1
Es ist nur eine JAR-Datei? Wo kann ich es finden?
Omega
1
Laden Sie die "JRuby 1.7.2 Complete.jar"Datei von jruby.org/download herunter (auf derselben Seite finden Sie auch Sprachinstallationen, die für die Entwicklung nützlich sind, für Ihr endgültiges System ist jedoch nur die Datei complete.jar erforderlich!)
akuhn