2012-01-27 54 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