简介 本文介绍如何在Eclipse中使用Ruby开发工具(RDT)插件进行Ruby开发。本文将有益于那些想学习如何使用Eclipse基础架构来进行Ruby开发的Ruby开发者,也有益于对Ruby开发感兴趣的Java开发者。
一、 为什么使用Ruby?
现在,为什么众多的Java开发者都关注Ruby?Ruby,是10年以前在日本创建的一种通用目的脚本语言,这是一种纯面向对象的语言。不同于Java技术,Ruby中的一切都是对象。Ruby的语法主要来源于Smalltalk,Python和Ada。象Java编程语言一样,Ruby是一种单继承的语言,但是它提供了一些Java技术所没有实现的高级特征,例如闭合(可以认为是一种匿名的内部类)和mix-in(类似于接口,但是较松地绑定于类上)。Ruby也是高度可移植的,能够运行在所有主流的操作系统之上。
现在,Ruby正十分热门。人们正在开始把它应用于各种类型的应用程序。因为它是解释型并且使用动态类型化,所以你可以在运行时刻实现在Java中很难实现的技巧。由动态类型化和富于表达的语法所实现的令人吃惊的能力之一是它能够用Ruby创建域特定的语言(DSL)-它们允许你在更高级别的抽象层上工作,从而远离最原始的语言语法。Ruby on Rails是一种创建基于数据库支持的Web应用程序的框架,这也展示了Ruby的力量。Rake,作为Ruby的Make和Ant合二为一的版本,是这种语言强有力的应用的又一个证明。
使用Ruby的另一个原因是,所有的编程发烧友都在使用它。现在,许多Java高手(如Glenn Vanderburg,Bruce Tate和Martin Fowler)都在使用Ruby。即使你不打算把你的所有开发转向Ruby,这种语言也值得你浏览一番。
限制Ruby发展的主要因素之一是,它缺乏一个良好的开发环境(对于那些不想学习Emacs的用户来说)。如今,RDT改变了这一切,而使用Eclipse对此进行试验则最好不过。
二、 安装
在使用Ruby之前,你必须安装Ruby解释器,相应的库和Ruby开发环境。
三、 取得Ruby
Ruby可用于所有主要的平台上。事实上,你的Linux或Cygwin分发包中可能已经包含了它。请打开一个命令提示符,然后输入"Ruby-v"。
如果你得到一个版本号,那么你已经准备好。否则,你需要检查你所选择的平台的分发包。
如果你正在运行Windows,则选择更容易。RubyForge,作为SourceForge上的Ruby特定的等价物,有一个工程称为One-Click Ruby Installer,这个程序用于在Windows平台上搭建Ruby环境。它还包括另外一些工具,如一个称为FreeRide的IDE;但是如果你使用RDT的话,你在安装过程中可以跳过这些这项。
四、 取得文档
当你开始使用一种新语言时,文档及有关参考材料是至关重要的。你可以在主Ruby网站得到Ruby文档的在线参考材料,但是你会发现这些文档有点过时(它们是针对于Ruby 1.6版本的,而当前版本是1.8.2)。问题是,更新的文档目前还没有从日语翻译过来。然而,你可以在Ruby-doc.org上找到最新的帮助文档。它包括API级的文档(Javadoc的等价物),还有其它一些教程和书籍。
如果你是一位严肃的Ruby开发者,那么你应该阅读一下《Programming Ruby:The Pragmatic Programmer's Guide》(作者是Dave Thomas和Andy Hunt)一书以取得最佳编程效果。这是一本有关Ruby及Ruby库编程的经典指南。如果你得到此书,那么你还可以参考也是Dave Thomas编写的《Agile Development with Ruby on Rails》一书。这是一本有关Ruby on Rails的入门性书籍。
五、 得到RDT
现在,既然你在自己的计算机上安装了一个可工作的具有良好帮助文档的Ruby,那么接下来你需要安装RDT了。这是一个Eclipse插件,它提供了许多你可能在编辑代码时已习惯的特征。RDT是一个标准的Eclipse插件;因此,你可以直接把压缩文件解压到Eclipse文件夹下,由文档中的路径来处理其它一切。
现在,你已经准备好创建一个Ruby工程了(见图1)。
![]() 图1.创建一个新的Ruby工程 |
![]() 图2.创建一个Ruby源文件 |
![]() 图3.创建一个Ruby文件将启动Ruby视图 |
![]() 图6.RDT编辑器提供了内容助手 |
![]() 图7.在Ruby帮助内容助手中的命名惯例 |
七、 运行与调试
IDE的特色之一是在同一个环境下运行和调试你构建的应用程序。RDT能够启用这两项功能。
八、 指定一个解释器
这一任务的实现位于Ruby上部和"Installed Interpreters"入口的"Windows>Preferences"对话框中。
Ruby是一种解释性的语言,因此,在RDT能够运行或调试你的应用程序之前,你必须把一个解释器与你的环境关联。这种关联位于Ruby顶部的"Windows>Preferences"对话框中的"Installed Interpreters"入口处。
![]() 图9.在RDT中建立一个Run配置 |
十一、 测试
作为Java开发者最难实现的Ruby特征之一是动态类型化。如果你习惯于一种强类型化语言,那么动态类型化看上去似乎有点混乱。DT允许各种高级元编程技巧-这在一种强类型化语言中是很难或不可能实现的。当然,你可以放弃编译时刻类型检查的安全设置。那么,是否有一个方法能够实现两种世界的最佳结合呢?
单元测试应该是每一种语言必须实现的,但是它在动态语言中特别关键。单元测试比编译揭示了更多的内容。事实上,你应该改变在单元测试和编译之间的关系上的观点。最近,一位高级软件开发专家认为,"在今后的五年内,我们会把编译作为单元测试的一种弱的实现形式"。单元测试能够提供证实(verification)-编码将如期实现,而不是仅仅进行你输入内容的语法检查。
考虑到单元测试在Ruby世界中的极端重要性,你一定会希望RDT能够使得单元测试易于运行。的确如此!单元测试被包括在Ruby内,因此你不必下载任何其它的扩展。Ruby库中包括了一个TestCase类和一个TestSuite的概念。你可以象创建任何另外的Ruby类一样来创建你的单元测试,从Test::Unit::TestCase中子类化你的测试。列表1是一个Employee类的实例。
列表1.Employee类
| class Employee def initialize(name, salary, hire_year) @name = name @salary = salary @hire_year = hire_year end attr_reader :name, :salary, :hire_year def raise_salary_by(perc) @salary += (@salary * (perc * 0.01)) end def to_s "Name is #{@name}, salary is #{@salary}, " + "hire year is #{@hire_year}" end end |
| require 'test/unit/testcase' require 'test/unit/autorunner' require 'hr' class TestEmployee < Test::Unit::TestCase @@Test_Salary = 2500 def setup @emp = Employee.new("Homer", @@Test_Salary, 2003) end def test_raise_salary @emp.raise_salary_by(10) expected = (@@Test_Salary * 0.10) + @@Test_Salary assert( expected == @emp.salary) end end |
![]() 图12.RDT包括一个Test::Unit Run配置 |
![]() 图13.运行于IDE中的一个单元测试的例子 |
| require 'test/unit/testsuite' require 'test/unit/ui/tk/testrunner' require 'test/unit/ui/console/testrunner' require 'TestEmployee' require 'TestManager' class TestSuite_AllTests def self.suite suite = Test::Unit::TestSuite.new("HR Tests") suite << TestEmployee.suite suite << TestManager.suite return suite end end #Test::Unit::UI::Tk::TestRunner.run(TestSuite_AllTests) Test::Unit::UI::Console::TestRunner.run(TestSuite_AllTests) |
![]() 图14.图形式的TestSuite对话框 |