-
2007-08-08
XRuby0.3.0——奥运倒计时一周年纪念版
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
XRuby0.3.0发布了!恰好今天是奥运倒计时一周年,所以,这个版本顺理成章的成了纪念版。
http://dreamhead.blogbus.com/logs/7548397.html
在这个版本中,除了让更多单元测试通过之外,最大的变化是在Annotation的应用上。关于Annotation的工作,我已经在自己的blog上讨论过一些,这里再整理一下。
Ruby的方法总要有一个对应的底层语言实现。在C Ruby中,这个对应就是一个C的函数,而定义的时候,直接使用函数指针去做这个关联。而在Java中,因为没有函数指针,作为替代方案,我们可以使用一个对象。在XRuby的实现中,RubyMethod的存在就是为了这个目的。所以,在XRuby中对应到Ruby的方法都源自RubyMethod,比如下面这段代码:
public class String_to_f extends RubyNoArgMethod {
protected RubyValue run(RubyValue receiver, RubyBlock block) {
return ((RubyString)receiver).to_f();
}
}
从上面展示的代码中,我们可以看到,为了实现这段方法,最终需要访问receiver的内容,而且,在事实的开发中,我们经常发现一个两难的抉择:究竟把方法的具体实现放在RubyMethod中还是放在Java的方法中。
有了对应的实现,我们还需要将它注册到系统中:
StringClass.defineMethod(“to_f”, new String_to_f());
这段虽然不复杂,重复编写也不是一件让人愉快的事情。
通过Annotation,我们可以更好的解决这个问题,下面便是对应于上面实现的代码:
@RubyLevelClass(name="String")
public class RubyString {
@RubyLevelMethod(name="to_f")
public RubyFloat to_f() {
...
}
}
在这里,我们使用RubyLevelMethod将一个Java的方法和Ruby的方法绑定在一起,这个Annotation表示,一方面会生成一个对应于这个方法的RubyMethod实现满足调用规则,另一方面会在Ruby的类中定义出这个方法,减少了一些重复编码的工作量。使用Annotaion避免了前面提及的那种两难,所有的方法都实现在Java方法中即可,这样,便可以有效的减少设计上的迷惑。再有,这个Annotation可以让Java方法和Ruby方法的关联一目了然。
一如既往的欢迎对XRuby有兴趣的人加入到XRuby的开发中来,在这里,总是有一些有趣的问题可以解决。
引用地址:









