我正在圍繞一個紅寶石寶石編寫一個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
例子顯然有一些內部「魔力」,所以我想知道是否爲其他類型提供了類似的轉換,哪些類型和它們在哪裏被記錄。
任何指針非常讚賞。
這是個好地方,謝謝。當然,當我從Java調用Ruby時,我並不認爲要在文檔的「一側」上看!之後,我設法向JRuby添加了足夠的代碼,用於將Ruby URI類自動強制到Java URI對象中,但這很難,需要做大量工作才能「正確完成」 - 如果它適合做到這一點那樣。 – 2012-04-11 20:50:42