JRuby: Документирование отображений / преобразований между типами / классами Java и Ruby? - PullRequest
4 голосов
/ 27 января 2012

Я пишу библиотеку 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 явно есть некоторая внутренняя «магия», поэтому мне было интересно, были ли предоставлены аналогичные преобразования для других типов, типов и где они документированы.

Любые указатели высоко ценятся.

1 Ответ

4 голосов
/ 08 апреля 2012

https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby говорит "Преобразование типов - Ruby в Java - См. Исходный код JRuby rspec dir spec/java_integration, чтобы найти еще много примеров. [examples, ...]".

Конечно же, 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

Я считаю, что это лучшая документация, доступная на данный момент.

...