Làm cách nào để thực thi tệp Ruby trong Java, có khả năng gọi các hàm từ chương trình Java và nhận kết quả kiểu nguyên thủy?


8

Tôi hoàn toàn không hiểu những gì tôi đang hỏi (lol!), Vâng, theo nghĩa là nếu nó thậm chí có thể, đó là. Nếu không, xin lỗi.

Giả sử tôi có một chương trình Java. Nó có một Mainvà một JavaCalculatorlớp học. JavaCalculatorcó một số chức năng cơ bản như

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

Bây giờ giả sử tôi có một tập tin ruby. Được gọi là MyProgram.rb.

MyProgram.rbcó thể chứa bất cứ điều gì bạn có thể mong đợi từ một chương trình ruby. Chúng ta hãy giả sử nó chứa những điều sau đây:

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

Tốt Bây giờ sau đó, bạn có thể đã nghi ngờ những gì tôi muốn làm:

  • Tôi muốn chạy chương trình Java của tôi
    • Tôi muốn nó thực thi tệp RubyMyProgram.rb
    • Khi chương trình Ruby thực thi, nó sẽ tạo một thể JavaCalculatorhiện, thực thi sumchức năng mà nó có, lấy giá trị và sau đó in nó.
    • Các tập tin ruby ​​đã được thực hiện thành công.
  • Chương trình Java đóng lại.

Lưu ý : "tạo một thể hiện của JavaCalculator" không hoàn toàn cần thiết. Tôi sẽ hài lòng với việc chỉ chạy một sumchức năng từ, nói, Mainlớp.

Câu hỏi của tôi: là như vậy có thể? Tôi có thể chạy một chương trình Java mà thực thi bên trong một tệp Ruby có khả năng ra lệnh cho chương trình Java thực hiện một số việc nhất định và nhận kết quả không? Trong ví dụ trên, tệp Ruby yêu cầu chương trình Java thực hiện một khoản tiền cho nó và đưa ra kết quả.


Điều này nghe có vẻ vô lý. Tôi là người mới trong loại điều này (nếu có thể, đó là).

TẠI SAO TÔI HỎI NÀY?

Tôi có một chương trình Java, một loại công cụ trò chơi. Tuy nhiên, đối tượng mục tiêu của tôi là một nhóm các lập trình viên Ruby. Tôi không muốn cho họ học Java cả. Vì vậy, tôi đã hình dung rằng có lẽ chương trình Java có thể chỉ đơn giản là cung cấp chức năng (khả năng tạo cửa sổ, hiển thị các họa tiết, phát âm thanh ...) và sau đó, khán giả của tôi có thể đơn giản viết mã bằng Ruby logic, về cơ bản, nó yêu cầu công cụ Java của tôi thực hiện những thứ như hiển thị sprite hoặc chơi âm thanh.

Đó là khi tôi nghĩ về điều này.


1
Bạn đã chấp nhận một câu trả lời dựa trên JRuby, đây là một giải pháp tốt cho một vấn đề rất cụ thể. Có nhiều câu trả lời chung chung khác áp dụng cho tình huống này và các tình huống tương tự, nhưng nếu bạn muốn xem chúng, có lẽ bạn sẽ phải hỏi lại câu hỏi theo một định dạng khác.
david.pfx

Câu trả lời:


12

Những gì bạn có thể thực sự theo đuổi là JRuby -> http://jruby.org/

JRuby là một triển khai Ruby tuân thủ đầy đủ tính năng trên Máy ảo Java. Theo một số người theo Ruby, nó cũng xảy ra nhanh nhất (giả sử bạn đang chạy trên máy ảo tương thích Java 7). JRuby có thể gọi vào các thư viện Java và nhận các giá trị trả về từ các cuộc gọi đó, trong ngắn hạn, bạn có thể có cả hai thế giới tốt nhất.


Mặc dù điều này nghe có vẻ hứa hẹn, tôi sẽ đánh giá cao một giải pháp cho kịch bản hiện tại của tôi (tôi có Java đơn giản và Ruby đơn giản), mà không sử dụng một "công cụ khác" như JRuby.
Omega

JRuby sẽ chạy mã Ruby đơn giản của bạn trên JVM - nhà phát triển của bạn vẫn có thể sử dụng Ruby :-).
Martijn Verburg

JRuby là con đường để đi!
akuhn

bạn có phiền giải thích thêm về những gì nó làm và những gì nó tốt cho? "Câu trả lời chỉ liên kết" không được chào đón tại Stack Exchange
gnat

1
Phải bạn - câu trả lời hơi mở rộng - HTH!
Martijn Verburg

9

Vì bạn dường như không tin chúng tôi.

Đây là cách chạy mã ruby ​​từ Java, sử dụng JRuby. JRuby không phải là một công cụ khác. Đây chỉ là tệp JAR mà bạn cần để có thể chạy Ruby trên Java. Nó đơn giản như

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

}

Như bạn có thể thấy, việc dịch từ quy ước đặt tên hello_worldcủa Ruby sang Java là rất thông minh getHelloWorld.


1
Nó chỉ là một tập tin JAR? Tôi có thể tìm thấy nó ở đâu?
Omega

1
Tải xuống "JRuby 1.7.2 Complete.jar"tệp từ jruby.org/doad (bạn cũng sẽ tìm thấy các bản cài đặt ngôn ngữ trên cùng một trang, rất hữu ích để phát triển, nhưng hệ thống cuối cùng của bạn sẽ chỉ yêu cầu
Complete.jar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.