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