2012-01-27 110 views
3

我正在围绕一个红宝石宝石编写一个Java包装库,所以我在Java中嵌入了ruby,而不是其他方式。我似乎在广大的少数民族!JRuby:Java和Ruby类型/类之间的映射/转换的文档?

如果我有一个返回Time对象,然后红宝石的方法,我可以很容易地转换成在Java端这样的java.util.Date对象:

public Date getStartTime() { 
    IRubyObject result = RuntimeHelpers.invoke(runtime.getCurrentContext(), 
     this, "start_time"); 
    return (Date) result.toJava(Date.class); 
} 

但我觉得我很幸运,由工作了这一点试验和错误,而不是所有类似的类型都可以通过这种方式进行转换。我有一个返回URI对象的另一个红宝石方法(它可能是一个URI::HTTP和事实URI::HTTPS),但试图明显(考虑到以上)转换为java.net.URI不工作(我也java.net.URL试了一下):

public URI getUri() { 
    IRubyObject result = RuntimeHelpers.invoke(runtime.getCurrentContext(), 
     this, "uri"); 
    return (URI) result.toJava(URI.class); 
} 

此代码编译,但在运行时出现故障:

Exception in thread "main" org.jruby.exceptions.RaiseException: (TypeError) cannot 
convert instance of class org.jruby.RubyObject to class java.net.URI 

我意识到,在红宝石URI实际上是一个模块和URI::HTTPS等都是类,所以我并不完全感到惊讶的是,上面没有工作。但是对于Time/Date例子显然有一些内部“魔力”,所以我想知道是否为其他类型提供了类似的转换,哪些类型和它们在哪里被记录。

任何指针非常赞赏。

回答

4

https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby说 “类型的转换 - 红宝石到Java - 见JRuby的RSpec的源代码有更多的例子目录spec/java_integration【事例,...]。”

果然,coercion_spec.rb包含了很多示例/规范。这里是你已经使用的情况:

describe "Time\"to_java" do 
    describe "when passed java.util.Date" do 
    it "coerces to java.util.Date" do 
     t = Time.now 
     d = t.to_java(java.util.Date) 
     d.class.should == java.util.Date 
    end 
    end 

    # [...] 
end 

我相信这是目前可用的最好的文档。

+1

这是个好地方,谢谢。当然,当我从Java调用Ruby时,我并不认为要在文档的“一侧”上看!之后,我设法向JRuby添加了足够的代码,用于将Ruby URI类自动强制到Java URI对象中,但这很难,需要做大量工作才能“正确完成” - 如果它适合做到这一点那样。 – 2012-04-11 20:50:42