簡(jiǎn)介 本文介紹如何在eclipse中使用ruby開(kāi)發(fā)工具(rdt)插件進(jìn)行ruby開(kāi)發(fā)。本文將有益于那些想學(xué)習(xí)如何使用eclipse基礎(chǔ)架構(gòu)來(lái)進(jìn)行ruby開(kāi)發(fā)的ruby開(kāi)發(fā)者,也有益于對(duì)ruby開(kāi)發(fā)感興趣的java開(kāi)發(fā)者。
一、 為什么使用ruby?
現(xiàn)在,為什么眾多的java開(kāi)發(fā)者都關(guān)注ruby?ruby,是10年以前在日本創(chuàng)建的一種通用目的腳本語(yǔ)言,這是一種純面向?qū)ο蟮恼Z(yǔ)言。不同于java技術(shù),ruby中的一切都是對(duì)象。ruby的語(yǔ)法主要來(lái)源于smalltalk,python和ada。象java編程語(yǔ)言一樣,ruby是一種單繼承的語(yǔ)言,但是它提供了一些java技術(shù)所沒(méi)有實(shí)現(xiàn)的高級(jí)特征,例如閉合(可以認(rèn)為是一種匿名的內(nèi)部類(lèi))和mix-in(類(lèi)似于接口,但是較松地綁定于類(lèi)上)。ruby也是高度可移植的,能夠運(yùn)行在所有主流的操作系統(tǒng)之上。
現(xiàn)在,ruby正十分熱門(mén)。人們正在開(kāi)始把它應(yīng)用于各種類(lèi)型的應(yīng)用程序。因?yàn)樗墙忉屝筒⑶沂褂脛?dòng)態(tài)類(lèi)型化,所以你可以在運(yùn)行時(shí)刻實(shí)現(xiàn)在java中很難實(shí)現(xiàn)的技巧。由動(dòng)態(tài)類(lèi)型化和富于表達(dá)的語(yǔ)法所實(shí)現(xiàn)的令人吃驚的能力之一是它能夠用ruby創(chuàng)建域特定的語(yǔ)言(dsl)-它們?cè)试S你在更高級(jí)別的抽象層上工作,從而遠(yuǎn)離最原始的語(yǔ)言語(yǔ)法。ruby on rails是一種創(chuàng)建基于數(shù)據(jù)庫(kù)支持的web應(yīng)用程序的框架,這也展示了ruby的力量。rake,作為ruby的make和ant合二為一的版本,是這種語(yǔ)言強(qiáng)有力的應(yīng)用的又一個(gè)證明。
使用ruby的另一個(gè)原因是,所有的編程發(fā)燒友都在使用它。現(xiàn)在,許多java高手(如glenn vanderburg,bruce tate和martin fowler)都在使用ruby。即使你不打算把你的所有開(kāi)發(fā)轉(zhuǎn)向ruby,這種語(yǔ)言也值得你瀏覽一番。
限制ruby發(fā)展的主要因素之一是,它缺乏一個(gè)良好的開(kāi)發(fā)環(huán)境(對(duì)于那些不想學(xué)習(xí)emacs的用戶(hù)來(lái)說(shuō))。如今,rdt改變了這一切,而使用eclipse對(duì)此進(jìn)行試驗(yàn)則最好不過(guò)。
二、 安裝
在使用ruby之前,你必須安裝ruby解釋器,相應(yīng)的庫(kù)和ruby開(kāi)發(fā)環(huán)境。
三、 取得ruby
ruby可用于所有主要的平臺(tái)上。事實(shí)上,你的linux或cygwin分發(fā)包中可能已經(jīng)包含了它。請(qǐng)打開(kāi)一個(gè)命令提示符,然后輸入"ruby-v"。
如果你得到一個(gè)版本號(hào),那么你已經(jīng)準(zhǔn)備好。否則,你需要檢查你所選擇的平臺(tái)的分發(fā)包。
如果你正在運(yùn)行windows,則選擇更容易。rubyforge,作為sourceforge上的ruby特定的等價(jià)物,有一個(gè)工程稱(chēng)為one-click ruby installer,這個(gè)程序用于在windows平臺(tái)上搭建ruby環(huán)境。它還包括另外一些工具,如一個(gè)稱(chēng)為freeride的ide;但是如果你使用rdt的話(huà),你在安裝過(guò)程中可以跳過(guò)這些這項(xiàng)。
四、 取得文檔
當(dāng)你開(kāi)始使用一種新語(yǔ)言時(shí),文檔及有關(guān)參考材料是至關(guān)重要的。你可以在主ruby網(wǎng)站得到ruby文檔的在線(xiàn)參考材料,但是你會(huì)發(fā)現(xiàn)這些文檔有點(diǎn)過(guò)時(shí)(它們是針對(duì)于ruby 1.6版本的,而當(dāng)前版本是1.8.2)。問(wèn)題是,更新的文檔目前還沒(méi)有從日語(yǔ)翻譯過(guò)來(lái)。然而,你可以在ruby-doc.org上找到最新的幫助文檔。它包括api級(jí)的文檔(javadoc的等價(jià)物),還有其它一些教程和書(shū)籍。
如果你是一位嚴(yán)肅的ruby開(kāi)發(fā)者,那么你應(yīng)該閱讀一下《programming ruby:the pragmatic programmer's guide》(作者是dave thomas和andy hunt)一書(shū)以取得最佳編程效果。這是一本有關(guān)ruby及ruby庫(kù)編程的經(jīng)典指南。如果你得到此書(shū),那么你還可以參考也是dave thomas編寫(xiě)的《agile development with ruby on rails》一書(shū)。這是一本有關(guān)ruby on rails的入門(mén)性書(shū)籍。
五、 得到rdt
現(xiàn)在,既然你在自己的計(jì)算機(jī)上安裝了一個(gè)可工作的具有良好幫助文檔的ruby,那么接下來(lái)你需要安裝rdt了。這是一個(gè)eclipse插件,它提供了許多你可能在編輯代碼時(shí)已習(xí)慣的特征。rdt是一個(gè)標(biāo)準(zhǔn)的eclipse插件;因此,你可以直接把壓縮文件解壓到eclipse文件夾下,由文檔中的路徑來(lái)處理其它一切。
現(xiàn)在,你已經(jīng)準(zhǔn)備好創(chuàng)建一個(gè)ruby工程了(見(jiàn)圖1)。
![]() 圖1.創(chuàng)建一個(gè)新的ruby工程 |
![]() 圖2.創(chuàng)建一個(gè)ruby源文件 |
![]() 圖3.創(chuàng)建一個(gè)ruby文件將啟動(dòng)ruby視圖 |
![]() 圖4.這個(gè)outline視圖實(shí)現(xiàn)在源文件中的導(dǎo)航 |
![]() 圖5.rdt安裝"preferences"以便實(shí)現(xiàn)定制 |
![]() 圖6.rdt編輯器提供了內(nèi)容助手 |
![]() 圖7.在ruby幫助內(nèi)容助手中的命名慣例 |
七、 運(yùn)行與調(diào)試
ide的特色之一是在同一個(gè)環(huán)境下運(yùn)行和調(diào)試你構(gòu)建的應(yīng)用程序。rdt能夠啟用這兩項(xiàng)功能。
八、 指定一個(gè)解釋器
這一任務(wù)的實(shí)現(xiàn)位于ruby上部和"installed interpreters"入口的"windows>preferences"對(duì)話(huà)框中。
ruby是一種解釋性的語(yǔ)言,因此,在rdt能夠運(yùn)行或調(diào)試你的應(yīng)用程序之前,你必須把一個(gè)解釋器與你的環(huán)境關(guān)聯(lián)。這種關(guān)聯(lián)位于ruby頂部的"windows>preferences"對(duì)話(huà)框中的"installed interpreters"入口處。
![]() 圖8.把一個(gè)ruby解釋器與環(huán)境相關(guān)聯(lián) |
![]() 圖9.在rdt中建立一個(gè)run配置 |
![]() 圖10.在rdt內(nèi)運(yùn)行一個(gè)ruby應(yīng)用程序 |
![]() 圖11.在rdt中調(diào)試ruby應(yīng)用程序 |
十一、 測(cè)試
作為java開(kāi)發(fā)者最難實(shí)現(xiàn)的ruby特征之一是動(dòng)態(tài)類(lèi)型化。如果你習(xí)慣于一種強(qiáng)類(lèi)型化語(yǔ)言,那么動(dòng)態(tài)類(lèi)型化看上去似乎有點(diǎn)混亂。dt允許各種高級(jí)元編程技巧-這在一種強(qiáng)類(lèi)型化語(yǔ)言中是很難或不可能實(shí)現(xiàn)的。當(dāng)然,你可以放棄編譯時(shí)刻類(lèi)型檢查的安全設(shè)置。那么,是否有一個(gè)方法能夠?qū)崿F(xiàn)兩種世界的最佳結(jié)合呢?
單元測(cè)試應(yīng)該是每一種語(yǔ)言必須實(shí)現(xiàn)的,但是它在動(dòng)態(tài)語(yǔ)言中特別關(guān)鍵。單元測(cè)試比編譯揭示了更多的內(nèi)容。事實(shí)上,你應(yīng)該改變?cè)趩卧獪y(cè)試和編譯之間的關(guān)系上的觀(guān)點(diǎn)。最近,一位高級(jí)軟件開(kāi)發(fā)專(zhuān)家認(rèn)為,"在今后的五年內(nèi),我們會(huì)把編譯作為單元測(cè)試的一種弱的實(shí)現(xiàn)形式"。單元測(cè)試能夠提供證實(shí)(verification)-編碼將如期實(shí)現(xiàn),而不是僅僅進(jìn)行你輸入內(nèi)容的語(yǔ)法檢查。
考慮到單元測(cè)試在ruby世界中的極端重要性,你一定會(huì)希望rdt能夠使得單元測(cè)試易于運(yùn)行。的確如此!單元測(cè)試被包括在ruby內(nèi),因此你不必下載任何其它的擴(kuò)展。ruby庫(kù)中包括了一個(gè)testcase類(lèi)和一個(gè)testsuite的概念。你可以象創(chuàng)建任何另外的ruby類(lèi)一樣來(lái)創(chuàng)建你的單元測(cè)試,從test::unit::testcase中子類(lèi)化你的測(cè)試。列表1是一個(gè)employee類(lèi)的實(shí)例。
列表1.employee類(lèi)
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包括一個(gè)test::unit run配置 |
![]() 圖13.運(yùn)行于ide中的一個(gè)單元測(cè)試的例子 |
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對(duì)話(huà)框 |
新聞熱點(diǎn)
疑難解答
圖片精選