Расширение (исправление обезьян) классов 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
? Если так,[]
и[]=
уже определены автоматически, как описано здесь .