Я пишу библиотеку Java-обертки вокруг гема ruby, поэтому встраиваю ruby в Java, а не наоборот. Кажется, я в подавляющем меньшинстве!
Если у меня есть метод ruby, который возвращает объект Time
, тогда я могу очень легко преобразовать его в java.util.Date
объект на стороне Java, например:
public Date getStartTime() {
IRubyObject result = RuntimeHelpers.invoke(runtime.getCurrentContext(),
this, "start_time");
return (Date) result.toJava(Date.class);
}
Но я думаю, что мне повезло, что я решил это методом проб и ошибок, и не все типы, кажущиеся кажущимися, могут быть преобразованы таким образом. У меня есть другой метод ruby, который возвращает объект 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
Я понимаю, что в ruby URI
на самом деле является модулем, а URI::HTTPS
и т. Д. Являются классами, поэтому я не совсем удивлен, что вышеприведенное не сработало. Но для примера Time
/ Date
явно есть некоторая внутренняя «магия», поэтому мне было интересно, были ли предоставлены аналогичные преобразования для других типов, типов и где они документированы.
Любые указатели высоко ценятся.