¿Cómo ejecutar un archivo Ruby en Java, capaz de invocar funciones desde el programa Java y recibir resultados de tipo primitivo?

8

No entiendo completamente lo que estoy preguntando (¡jaja!), Bueno, en el sentido de si es posible, eso es. Si no es así, lo siento.

Supongamos que tengo un programa Java. Tiene una Mainy una JavaCalculatorclase. JavaCalculatortiene algunas funciones básicas como

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

Ahora supongamos que tengo un archivo ruby. Llamado MyProgram.rb.

MyProgram.rbpuede contener cualquier cosa que pueda esperar de un programa ruby. Supongamos que contiene lo siguiente:

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

Bueno. Ahora bien, es posible que ya sospeches lo que quiero hacer:

  • Quiero ejecutar mi programa Java
    • Quiero que ejecute el archivo RubyMyProgram.rb
    • Cuando se ejecuta el programa Ruby, creará una instancia de JavaCalculator, ejecutará la sumfunción que tiene, obtendrá el valor y luego lo imprimirá.
    • El archivo ruby ​​se ha ejecutado con éxito.
  • El programa Java se cierra.

Nota : "Crear una instancia de JavaCalculator" no es completamente necesario. Estaría satisfecho con solo ejecutar una sumfunción desde, digamos, la Mainclase.

Mi pregunta: ¿es posible? ¿Puedo ejecutar un programa Java que ejecute internamente un archivo Ruby que sea capaz de ordenar al programa Java que haga ciertas cosas y obtenga resultados? En el ejemplo anterior, el archivo Ruby le pide al programa Java que haga una suma y dé el resultado.


Esto puede sonar ridículo. Soy nuevo en este tipo de cosas (si es posible, eso es).

¿Por qué estoy preguntando esto?

Tengo un programa Java, que es una especie de motor de juego. Sin embargo, mi público objetivo es un grupo de codificadores de Ruby. No quiero que aprendan Java en absoluto. Así que pensé que tal vez el programa Java podría simplemente ofrecer la funcionalidad (capacidad para crear ventanas, mostrar sprites, reproducir sonidos ...) y luego, mi audiencia puede simplemente codificar con Ruby la lógica, que básicamente le pide a mi motor Java que haga cosas como mostrar sprites o reproducir sonidos.

Entonces pensé en preguntar esto.

Omega
fuente
1
Ha aceptado una respuesta basada en JRuby, que es una buena solución para un problema muy específico. Hay muchas otras respuestas más generales que se aplican a esta y otras situaciones similares, pero si desea verlas, probablemente tendrá que hacer la pregunta nuevamente en un formato diferente.
david.pfx

Respuestas:

12

Lo que probablemente realmente buscas es JRuby -> http://jruby.org/

JRuby es una implementación de Ruby compatible con todas las funciones en la máquina virtual Java. Según algunos Rubyists, también es el más rápido (suponiendo que se esté ejecutando en una VM compatible con Java 7). JRuby puede llamar a bibliotecas Java y tomar valores de retorno de esas llamadas, en resumen, puede tener lo mejor de ambos mundos.

Martijn Verburg
fuente
Si bien esto parece prometedor, agradecería una solución para mi escenario actual (tengo Java y Ruby), sin el uso de una "herramienta diferente" como JRuby.
Omega
JRuby ejecutará su código Ruby simple en la JVM; sus desarrolladores aún pueden usar Ruby :-).
Martijn Verburg
JRuby es el camino a seguir!
akuhn
¿te importaría explicar más sobre lo que hace y para qué sirve? Las "respuestas de solo enlace" no son bienvenidas en Stack Exchange
mosquito
1
Tienes razón - respuesta ligeramente ampliada - ¡HTH!
Martijn Verburg
9

Ya que no pareces creernos.

Aquí se explica cómo ejecutar código ruby ​​desde Java, utilizando JRuby. JRuby no es "una herramienta diferente", es solo el archivo JAR que necesita para poder ejecutar Ruby sobre Java. Es tan simple como

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

}

Como puede ver, es muy inteligente traducir de Ruby's hello_worlda la getHelloWorldconvención de nomenclatura de Java .

akuhn
fuente
1
¿Es solo un archivo JAR? ¿Dónde puedo encontrarlo?
Omega
1
Descargue el "JRuby 1.7.2 Complete.jar"archivo de jruby.org/download (también encontrará instalaciones de idiomas en la misma página, que son útiles para el desarrollo, ¡pero su sistema final solo requerirá el complete.jar!)
akuhn