我目前正在检查将一个大项目从JRuby移植到Truffle Ruby的可能性,并且遇到了一个潜在的交易破坏者,因为Truffle文档说Java类不能重新打开。
我们使用GraalVM库中的polyglot
包。
我们的项目使用了一个专有的JavaMap实现(称为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中复制这种行为的方法吗?
编辑:
作为对aled评论的回复,这里有一个JRuby monkey补丁的例子,它已经被修改为使用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条答案
按热度按时间hgncfbus1#
GMap
是否实现了java.util.Map
?如果是这样,[]
和[]=
已经自动定义,如here所述。