Come eseguire un file Ruby in Java, in grado di chiamare funzioni dal programma Java e ricevere risultati di tipo primitivo?

8

Non capisco perfettamente cosa sto chiedendo (lol!), beh, nel senso di se è persino possibile, cioè. Se non lo è, mi dispiace.

Supponiamo di avere un programma Java. Ha una classe Main e una JavaCalculator . JavaCalculator ha alcune funzioni di base come

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

Ora supponiamo di avere un file rubino. Chiamato MyProgram.rb .

MyProgram.rb può contenere qualsiasi cosa ci si possa aspettare da un programma ruby. Supponiamo che contenga quanto segue:

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

Buona. Ora, potresti già sospettare ciò che voglio fare:

  • Voglio eseguire il mio programma Java
    • Voglio che esegua il file Ruby MyProgram.rb
    • Quando viene eseguito il programma Ruby, creerà un'istanza di JavaCalculator , eseguirà la funzione sum che ha, ottiene il valore e quindi lo stampa.
    • Il file ruby è stato eseguito con successo.
  • Il programma Java si chiude.

Nota : il "creare un'istanza di JavaCalculator " non è interamente necessario. Sarei soddisfatto della semplice esecuzione di una funzione sum da, ad esempio, la classe Main .

La mia domanda: è possibile? Posso eseguire un programma Java che esegue internamente un file Ruby che è in grado di comandare il programma Java per fare determinate cose e ottenere risultati? Nell'esempio sopra, il file Ruby chiede al programma Java di fare una somma per esso e dare il risultato.

Può sembrare ridicolo. Sono nuovo in questo genere di cose (se è possibile, cioè).

PERCHÉ MI CHIEDO QUESTO?

Ho un programma Java, che è una specie di motore di gioco. Tuttavia, il mio target di riferimento è un gruppo di programmatori Ruby. Non voglio che imparino Java. Quindi ho pensato che forse il programma Java poteva semplicemente offrire la funzionalità (capacità di creare finestre, visualizzare sprite, riprodurre suoni ...) e quindi, il mio pubblico può semplicemente codificare con Ruby la logica, che fondamentalmente chiede al mio motore Java di fare cose come visualizzare sprite o riprodurre suoni.

Questo è il momento in cui chiedo questo.

    
posta Omega 20.12.2012 - 08:30
fonte

2 risposte

12

Quello che probabilmente stai davvero dopo è JRuby - > link

JRuby è un'implementazione di Ruby completa e conforme alla Java Virtual Machine. Secondo alcuni Rubyists, sembra anche essere il più veloce (supponendo che tu stia girando su una VM compatibile con Java 7). JRuby può chiamare in librerie Java e prendere i valori di ritorno da quelle chiamate, in breve puoi avere il meglio di entrambi i mondi.

    
risposta data 20.12.2012 - 09:13
fonte
9

Dal momento che non sembra crederci.

Ecco come eseguire il codice ruby da Java, usando JRuby. JRuby non è "uno strumento diverso", è solo il file JAR che devi essere in grado di eseguire Ruby su Java. È semplice come

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

}

Come puoi vedere, è anche molto intelligente tradurre dalla% di% co_de di Ruby alla convenzione di denominazione hello_world di Java.

    
risposta data 24.12.2012 - 05:54
fonte

Leggi altre domande sui tag