编程语言
首页 > 编程语言> > 如何使用JRuby在Java中创建Ruby模块?

如何使用JRuby在Java中创建Ruby模块?

作者:互联网

Ruby中,我可以有一个类似的模块:

module Greeter
  def greet
    print "Hello"
  end
end

我的班级可以得到这样的问候方法:

class MyClass
  include Greeter
end

obj = MyClass.new
obj.greet

现在,我想让我的模块Greeter用Java实现.我正在使用JRuby.我不确定如何用Java创建一个Ruby模块(这样我可以正常包含).

我曾经做过Java接口.将它包含在我的Ruby类中并不会抛出错误,但它实际上并不是一回事,因为模块似乎实现了这些方法,而Java接口却没有.

解决方法:

以下是如何使用Java扩展实现与上面完全相同的代码.

这里的所有内容都是默认的包级别(没有包),如果你想让包只更改模块名称.

首先,创建Greeter类:

import org.jruby.anno.JRubyMethod;
import org.jruby.runtime.ThreadContext;
import org.jruby.runtime.builtin.IRubyObject;

public class Greeter {

    @JRubyMethod
    public static void greet( ThreadContext context, IRubyObject self ) {
        System.out.printf("Hello from %s%n", self);
    }

}

然后你需要GreeterService来加载它:

import org.jruby.Ruby;
import org.jruby.RubyModule;
import org.jruby.runtime.load.BasicLibraryService;

import java.io.IOException;

public class GreeterService implements BasicLibraryService {

    @Override
    public boolean basicLoad(final Ruby runtime) throws IOException {
        RubyModule greeter = runtime.defineModule(Greeter.class.getSimpleName());
        greeter.defineAnnotatedMethods(Greeter.class);

        return true;
    }

}

通过定义这些类,以下是如何在JRuby脚本中使用它们:

require 'target/jruby-example.jar'
require 'greeter'

class MyClass
  include Greeter
end

obj = MyClass.new
obj.greet

jruby-example.jar包含上面编译和打包的类.这里没有什么可做的,现在你有了可以包含在任何地方的模块.更大的例子,只需检查Enumerable模块的实现方式.

标签:java,module,ruby,jruby
来源: https://codeday.me/bug/20190529/1175965.html