科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Java世界的Ruby(3)

Java世界的Ruby(3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

这篇文章,我希望能够和你一起分享我在开发Java系统的时候使用Ruby的那种兴奋感。我比较一下Java和Ruby的优点和缺点,而且介绍一下JRuby解释器的支持者和反对者...

作者:silentbalanceyh 来源:IT专家网 2008年5月6日

关键字: RUBY 世界 java

  • 评论
  • 分享微博
  • 分享邮件
 为了方便编写Java应用程序,Bean Scripting Framework(BSF)在JVM和多种动态语言之间提供了一种标准接口,包括Ruby、Python、BeanShell、Groovy、和JavaScript;Java Specification Request(JSR)223,提供BSF的成功规范,将成为Java 6里面的标准部分。Java代码能够发送一个变量到JRuby的名称空间JRuby可以直接操作这些Java对象或者返回一个值到Java。使用BSF和JSR223,在Java和任何脚本语言之间的用于解释的语法是相同的。Listing 6显示了一个BSF使用Ruby的基本例子,这些在线例子的完整代码放置在bsf_example目录下。注意BSF不仅包括包外的JRuby支持;但是增加它的简单指令在JRuby文档里面是可使用的。

  Listing 6. Embed a Ruby interpreter

...
// JRuby must be registered in BSF.
// jruby.jar and bsf.jar must be on classpath.
BSFManager.registerScriptingEngine("ruby",
    "org.jruby.javasupport.bsf.JRubyEngine",  new String[]{"rb"});
BSFManager manager = new BSFManager();
// Make the variable myUrl available from Ruby.
manager.declareBean("myUrl", new URL("http://www/jruby.org"), URL.class);
// Note that the Method getDefaultPort is available from Ruby
// as getDefaultPort and also as defaultPort.
// The following line illustrates the combination of Ruby syntax
// and a Java method call.
String result = (String) manager.eval(
    "ruby", "(java)", 1, 1, "if $myUrl.defaultPort< 1024 then " +
    "'System port' else 'User port' end");

  在Java里面直接使用JRuby解释器也是可能的,但是像这样会连接你的Java代码到Ruby规范化的Java封装类,这些在BSF/JSR223里面是很严格的。

  局限性

  很重要的一点是你必须记住JRuby仍然在开发中,它还有很多局限,这些在1.0 release版本之前会固定下来。

  一个Ruby类是不能从一个Java抽象类继承的。不幸的是,这种限制使你不能简单创建一个具体的Java子类,使用虚方法实现抽象方法用于让Ruby类来继承。这是因为在Ruby/Java继承在JRuby的最近的版本中的第二个限制:Java代码不能多态地调用重写一个Java方法的Ruby方法。

  这些限制让Swing的使用显得很困难。比如,通过继承AbstractTableModel去利用添加到TableModel接口的功能是不可能的。你能够将继承转化为代理绕过这个限制:使用一个具体Java填充类继承于抽象类作为类型接口的一个代理,这个接口包括所有的Java方法。一个Ruby类实现这个代理接口。尽管这种做法近似于排除了JRuby的平常优势,但是它提供了基于这个局限的工作区而且在需要的地方提供了弹性:在子类功能里。

 这篇文章,我希望能够和你一起分享我在开发Java系统的时候使用Ruby的那种兴奋感。我比较一下Java和Ruby的优点和缺点,而且介绍一下JRuby解释器的支持者和反对者...


  Ruby的标准库提供了很多方面的功能。这些不使用本地代码的方式,在JRuby版本中是包含了的。JRuby团队逐渐地完善很多类库,虽然一些是在本地代码上的一个简单层次,就像GUI类Tk一样,将不会再完善。包含其中的Java标准库,提供了很多必要的功能。

  JRuby现在在WEBrick Web服务器上提供了Ruby on Rails的基本支持;接下来的一个milestone版本里面将会在任何Servlet容器里面实现RoR的支持。RoR支持将使程序员利用一系列存在的Java库与Web框架的简易性结合在一起,但是确认JRuby是一种可选的Ruby解释器。

  因为有BUG,JRuby 0.9需要Java SE 5,但是将会在下一个版本中支持JRE 1.4。

  例子

  例子jms_example.rb举例说明了JRuby增长长度的用法。它显示了如何将消息从一个类结构传到另外一个类,结合两种不同点的模拟软件定义了分布式游戏引擎。这些代码使用先进的功能和元程序技术将任何类型的XML消息作为Ruby对象进行传输。代码注释可以帮助理解程序逻辑。

  在Java里面使用配置到达这种水平是不可能的;至少,用户能够插入编译代码。但是在Ruby里,动态代码是像静态代码一样自然和容易使用的。

  Ruby和Java的未来

  Ruby可以教会Java程序员很多。RoR框架显示了开发Web应用程序是如此的简单;利用JRuby,RoR将能够重用存在的Java功能。JRuby将在Java应用程序中加入Jython,JavaScript,和其他各种动态脚本语言。想要掌握这些技巧的开发人员需要学习动态脚本,这些将会覆盖越来越多的应用程序开发领域。尽管不使用动态脚本,Java开发者也能够看到Ruby带来的利益如同功能程序和元程序的概念。

 

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章