Como executar um arquivo Ruby em Java, capaz de chamar funções do programa Java e receber resultados do tipo primitivo?


8

Eu não entendo completamente o que estou perguntando (risos!), Bem, no sentido de se isso é possível, é isso. Se não for, desculpe.

Suponha que eu tenha um programa Java. Tem uma Maine uma JavaCalculatorclasse. JavaCalculatortem algumas funções básicas como

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

Agora, suponha que eu tenha um arquivo ruby. Chamado MyProgram.rb.

MyProgram.rbpode conter qualquer coisa que você poderia esperar de um programa ruby. Vamos supor que ele contenha o seguinte:

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

Boa. Agora, então, você já deve suspeitar do que eu quero fazer:

  • Eu quero executar meu programa Java
    • Eu quero que ele execute o arquivo RubyMyProgram.rb
    • Quando o programa Ruby é executado, ele cria uma instância de JavaCalculator, executa a sumfunção que possui, obtém o valor e depois imprime.
    • O arquivo ruby ​​foi executado com sucesso.
  • O programa Java fecha.

Nota : O "criar uma instância de JavaCalculator" não é totalmente necessário. Eu ficaria satisfeito em apenas executar uma sumfunção, digamos, da Mainclasse.

Minha pergunta: isso é possível? Posso executar um programa Java que execute internamente um arquivo Ruby capaz de comandar o programa Java para fazer certas coisas e obter resultados? No exemplo acima, o arquivo Ruby pede ao programa Java que faça uma soma e forneça o resultado.


Isso pode parecer ridículo. Eu sou novo nesse tipo de coisa (se é possível, é isso).

Por que estou perguntando isso?

Eu tenho um programa Java, que é algum tipo de mecanismo de jogo. No entanto, meu público-alvo é um monte de codificadores Ruby. Eu não quero que eles aprendam Java. Então imaginei que talvez o programa Java pudesse simplesmente oferecer a funcionalidade (capacidade de criar janelas, exibir sprites, reproduzir sons ...) e então, meu público-alvo pode simplesmente codificar com Ruby a lógica, que basicamente pede ao meu mecanismo Java que faça coisas como exibir sprites ou tocar sons.

Foi quando pensei em perguntar isso.


1
Você aceitou uma resposta baseada no JRuby, que é uma boa solução para um problema muito específico. Existem muitas outras respostas mais gerais que se aplicam a essa e a situações semelhantes, mas se você quiser vê-las, provavelmente precisará agora fazer a pergunta novamente em um formato diferente.
David.pfx 29/03

Respostas:


12

O que você provavelmente está procurando é o JRuby -> http://jruby.org/

O JRuby é uma implementação Ruby compatível com todos os recursos na Java Virtual Machine. De acordo com alguns rubiístas, também é o mais rápido (supondo que você esteja executando em uma VM compatível com Java 7). O JRuby pode chamar as bibliotecas Java e receber valores de retorno dessas chamadas. Em resumo, você pode ter o melhor dos dois mundos.


Embora isso pareça promissor, eu apreciaria uma solução para o meu cenário atual (eu tenho Java e Ruby), sem o uso de uma "ferramenta diferente" como o JRuby.
Omega

O JRuby executará seu código Ruby comum na JVM - seus desenvolvedores ainda podem usar o Ruby :-).
Martijn Verburg

JRuby é o caminho a seguir!
akuhn

você se importaria de explicar mais sobre o que faz e para que serve? "Respostas apenas para links" não são bem-vindas no Stack Exchange
gnat 31/03

1
Você está certo - resposta levemente expandida - HTH!
Martijn Verburg

9

Desde que você parece não acreditar em nós.

Veja como executar o código ruby ​​a partir do Java, usando o JRuby. O JRuby não é “uma ferramenta diferente”, é apenas o arquivo JAR que você precisa para executar o Ruby sobre o Java. É tão simples quanto

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 você pode ver, é muito inteligente traduzir da convenção de nomenclatura de Ruby hello_worldpara Java getHelloWorld.


1
É apenas um arquivo JAR? Onde posso encontrá-lo?
Omega

1
Faça o download do "JRuby 1.7.2 Complete.jar"arquivo em jruby.org/download (você também encontrará instalações de idiomas na mesma página, que são úteis para o desenvolvimento, mas seu sistema final exigirá apenas o complete.jar!)
akuhn
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.