• 2007-08-08

    XRuby0.3.0——奥运倒计时一周年纪念版

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/7548397.html

    XRuby0.3.0发布了!恰好今天是奥运倒计时一周年,所以,这个版本顺理成章的成了纪念版。

    在这个版本中,除了让更多单元测试通过之外,最大的变化是在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的开发中来,在这里,总是有一些有趣的问题可以解决。
    分享到:

    历史上的今天:

    大龄程序员 2015-08-08
    引用地址: