Расширение (исправление обезьян) классов Java в Truffle Ruby

В настоящее время я проверяю возможность переноса большого проекта с JRuby на Truffle Ruby и наткнулся на потенциальное препятствие, заключающееся в том, что в документации truffle говорится, что классы Java не могут быть повторно открыты.

Мы используем пакет из библиотеки GraalVM.

В нашем проекте используется собственная реализация карты Java (называемая GMap), которая используется практически везде в нашей базе кода Ruby. JRuby позволяет расширять класс Java, что очень полезно — не в последнюю очередь для сокрытия строгой типизации Java.

Например, в Java у нас может быть:

      GMap map = new GMap();
map.put("k1","test");
map.put("k2", 123);
String s = map.getStr("k1"); 
int i = map.getInt("k2");
...

В то время как JRuby позволяет добавлять в класс Java удобные методы:

      map = GMap.new
map[:key1] = 'test'
map[:key2] = 123
s = map[:key1]
i = map[:key2]
...

...что гораздо чище.

Кто-нибудь знает способ воспроизвести это поведение в Truffle Ruby?

РЕДАКТИРОВАТЬ:

В ответ на комментарий Аледа, вот пример обезьяньего патча JRuby, который был изменен для использованияpolyglotсинтаксис:

      Java.import 'org.jellyfish.gmap.GMap'

class GMap
  def [] (key)
    self.__send__(:getObj, [java.lang.String], 
      key.to_s.to_java(:string)) 
    end
  end
end 

Вторая строка кода завершается с ошибкой:

#<Polyglot::ForeignClass[Java] type org.jellyfish.gmap.GMap> не является классом

Для воспроизведения ошибки можно использовать любой стандартный класс Java.

1 ответ

ДелаетGMapосуществлятьjava.util.Map? Если так,[]и[]=уже определены автоматически, как описано здесь .

Другие вопросы по тегам