日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

脱离 Rails 看 Ruby

發布時間:2023/11/29 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 脱离 Rails 看 Ruby 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在開始這篇文章之前,我需要澄清一些事情。首先,這不是一篇關于 Ruby on Rails 的文章。如果您希望了解 Rails,每周(甚至每小時)都有相關的文章和 blog 出現,它們都對這個令人興奮的框架的眾多特性大加推崇;請參見 參考資料 中的列表。其次,本文并不是想預言,Java 面對像 Ruby on Rails 這樣更好的 語言、工具和框架會衰敗下去。所以本文并不涉及近來通常與 Ruby 最相關的主題。

別誤會 —— 我認為 Rails 是令人難以置信的!它的功能極其強大,已經明顯地改變了 Web 開發的面貌和步調。我只想指出一點:Ruby 要比 Rails 功能豐富,尤其是從 Java 開發人員的視角來看。

Rails 的專長是 Web 站點開發;但是,我自己沒有構建過全新的 Web 站點。我所工作的大多數 Web 站點已經 使用 Struts、Tapestry 或其他技術構建起來了。在我利用 Ruby 時,基本上是將它作為一種與 Java 平臺銜接的開發實踐。所以在本文中,我將談談如果您主要是 Java 開發人員,那么應該如何利用 Ruby 進行開發。

掌握多種語言的好處

如果您掌握了多種語言,在與多個國家的朋友一起旅行時能夠幫助他們消除語言障礙,從而獲得尊重,會外語也會提升您在本國語言環境中的地位。掌握多種編程語言 也有同樣的好處。與只會一種語言的人相比,掌握多種編程語言的開發人員在 IT 世界中會更自由(他們能夠將技能應用于任何環境),而且他們在自己的編程母語 領域中也會更受尊重,因為他們了解源自這種母語的其他東西。您不想掌握多種語言嗎?

感覺是如此不同

Ruby 的語法與 Java 語言的語法不同。首先,Ruby 沒有方括號或分號,而且它使類型成為完全可選的。有人可能會說 Ruby 的語法很簡潔,這正是它的意圖:這種語言使開發人員可以迅速編寫簡潔的代碼。

如果用 Java 語言和 Ruby 分別定義同一個類,通過比較,就能夠看到這種簡潔性。我先給出用 Java 語言編寫的兩個類 —— WordDefinition(就像是詞典)。在圖 1 所示的簡單類圖中,可以看出這兩個類有幾個關系(如果這種復雜性看起來不自然,請忍耐一下;這是有意義的!):

  • 一個 Word 可以擁有一個同義詞(Word 的實例)集合。
  • 一個 Word 還擁有一個 Definition 集合。
  • 一個 Definition 擁有一個對 Word 的聚合關聯。

圖 1. 具有單詞和定義的簡單詞典

用 Java 語言編寫的類定義

在清單 1 中,用 Java 語言定義了 Word 類。注意,必須對 Definition 和同義詞集合進行關系檢驗。這是因為在這個例子中,最初創建 Definition 時可以不帶 Word 關系,最初定義 Word 時也可以不帶 Definition


清單 1. 用 Java 語言編寫的 Word 類

清單 1 中的 Word 類相當簡單;它是一個 JavaBean,具有一個構造函數鏈,使用戶能夠用各種屬性集創建 Word。還要注意,它的 synonymsdefinitions 屬性是 只讀的(即沒有針對它們的設置方法)。只能添加 一個 Definition 實例,或者為一個同義詞添加 另一個 Word

在清單 2 中是相關的 Definition 類,這個類與 Word 類的相似之處是,它的 exampleSentences 屬性沒有對應的 set() 方法:


清單 2. 用 Java 語言編寫的 Definition 類

用 Ruby 編寫的類定義

在清單 3 中,可以看到用 Ruby 定義的這兩個類。清單 3 確實 看起來很不一樣,不是嗎?


清單 3. 用 Ruby 編寫的相同類

從清單 3 中可以看出,Ruby 的語法非常簡潔。但是,不要讓這種簡潔性欺騙了您,這段代碼中有許多內容!首先,在一個模塊 中定義了兩個類,模塊本質上相當于 Java 語言中的 。另外,能夠在一個文件中定義這些類,而 Java 語言要求用兩個文件。您還會注意到,Ruby 的構造函數名為 initialize,而 Java 語言中的構造函數使用類名進行命名。





回頁首


創建對象實例

在 Ruby 中創建新的對象實例的方式是不一樣的。Ruby 并不使用 Java 代碼中的 new ObjectInstance() 語法,Ruby 實際上支持在對象上調用 new 方法,即在內部調用 initialize 方法。在清單 4 中,可以看到如何在 Ruby 中創建一個 Word 實例和一些對應的 Definition


清單 4. 在 Ruby 中創建新的對象實例

在清單 4 中,我用 Ruby 的 require 方法(這個方法可以在 Kernel 類中找到)“導入了” dictionary 模塊。然后通過 Object.new 語法創建一個新的 Word 實例(ebullient)。盡管導入了 dictionary 模塊,但是仍然需要對對象實例進行限定,因此采用 Dictionary::Word。如果在 require 子句后面編寫了 include Dictionary,那么也可以去掉 Dictionary:: 前綴。

默認參數值

您是否注意到了,在清單 4 中創建 happy_wrd 實例時沒有 指定 Definition 或同義詞集合。我只為 spellingpart_of_speech 傳遞了值。可以進行這樣的省略是因為 Ruby 支持參數的默認值。在清單 3 定義的 Wordinitialize 方法中,指定了 definitions = []synonyms = [] 作為參數,這基本上就是告訴 Ruby 如果調用者沒有提供這些集合,就將它們默認設置為空集合。

還要注意,在 清單 3Definitioninitialize 方法如何通過將 example_sentences 設置為一個空集合,從而支持默認參數(word 的默認值 nil 是 Java 語言中 null 的 Ruby 版本)。回到 清單 1,在這里必須創建三個構造函數 才能獲得 Java 語言提供的相同靈活性!

現在,我用靈活的 initialize() 方法創建另一個 Word 實例,見清單 5:


清單 5. 靈活性的表現!

在定義兩個 Definition 之后,將它們添加進一個集合中(集合看起來就像 Java 語言中的數組)。然后將這個集合傳遞給 Wordinitialize() 方法。





回頁首


集合的處理

Ruby 的集合處理同樣簡單得令人吃驚;看看 Word 類中的 add_definitionadd_synonym 方法就知道了。<< 語法被重載,表示 add。如果再看看 清單 2 中的 Definition 類,就會發現 Java 語言中的對應代碼復雜多了:this.exampleSentences.add(exampleSentence)

干凈利落的方括號
對于集合,您不認為 Ruby 的 [] 語法非常干凈利落嗎?如果您是 Groovy 用戶,就應該很熟悉這種語法。

Ruby 的集合處理非常簡潔。在清單 6 中,可以看到組合集合(使用 + 操作符)和訪問成員(通過 [ position ])是多么容易,沒有 什么值得操心的東西!


清單 6. 簡練的集合

清單 6 中的代碼只觸及到了 Ruby 集合處理的皮毛!





回頁首


RubyBean?

清單 3 中的兩個類中您可能會注意到,Ruby 支持一種定義屬性的簡寫方式:attr_readerattr_writer。因為使用了這種方式,所以可以在 Word 類中設置 和獲取 對應的屬性,如清單 7 所示:


清單 7. attr_reader 和 attr_writer 的作用

attr_readerattr_writer 都不是關鍵詞,而是 Ruby 中的實際方法(在 Module 類中),它們以符號作為參數。符號 是前面有冒號(:)的任何變量,更妙的是符號本身也是對象!

注意,因為在 清單 3 中使 synonyms 成為只讀的,所以 Ruby 拒絕執行清單 7 中的最后一行代碼。另外,還可以使用 attr_accessor 方法編寫屬性聲明代碼,指出屬性是既可讀又 可寫的。





回頁首


觀察 Ruby 的迭代

靈活的迭代方式也是用 Ruby 編寫代碼時的樂趣之一。看一下清單 8,這里給出了 Wordinitialize() 方法:


清單 8. 閉包是很方便的

清單 8 的第四行有點兒與眾不同。為了讓初學者看明白,在 definitions 實例上調用 each 方法時使用了花括號。each 方法本質上就像 Java 語言中的 Iterator,但是它更簡潔。在清單 8 中,each 方法處理迭代的細節,使調用者能夠將注意力集中在想要的效果上。在這個例子中,傳遞一個代碼塊來表示以下意思:對于集合中的每個值 —— 即 idef(這是 Definition 的一個實例),將它的 word 屬性設置為 self(這相當于 Java 語言中的 this)。

清單 9 給出 Java 語言中等效的代碼行(取自 清單 1 中的 Word 構造函數):


清單 9. Ruby 的 each 方法就像 Java 的 Iterator

是的,是的,是的...!

Java 5 的泛型和新的 for 循環語法比清單 9 中的代碼好得多。Ruby 也 支持大家熟悉的 Java 循環結構,比如 forwhile;但是在實踐中很少用到這些結構,因為 Ruby 中的幾乎所有東西都支持迭代表示法。例如,在清單 10 中,可以看出迭代文件的內容是多么容易:


清單 10. 迭代非常簡單

Ruby 中支持 each 方法的任何類(比如 File)都允許以這種方式進行迭代。順便說一句,Ruby 的 puts 方法(見清單 10)相當于 Java 語言的 System.out.println





回頁首


條件語法

討論了循環之后,我們來看看 清單 3Word 類中的條件語句。在清單 11 中,單獨給出了 add_definition() 方法:


清單 11. 漂亮的條件語法

仔細看看第二行代碼。看得出 if 語句的邏輯嗎?可以 將它改寫為清單 12 所示的一般形式,但是清單 11 不是更好嗎?


清單 12. 表達條件有多種方式

在 Java 語言中,如果條件結構的體只有一行,那么可以省略括號。在 Ruby 中,如果條件結構的體只有一行,那么可以編寫 清單 11 中所示的表達式。還要注意,同樣的條件還可以寫成 definition.word = self unless definition.word == self,這使用了 Ruby 的 unless 特性。這很棒,不是嗎?





回頁首


Ruby 中的多態性

因為 Ruby 是動態類型語言,所以它不需要接口。但是要記住,接口的功能在 Ruby 中是存在的,只是以靈活得多的方式表現出來。Ruby 中的多態性被親切地稱為 “duck typing”(意思是,如果它走起路來像鴨子,叫起來也像鴨子,那么它一定是鴨子!),這種多態性只是對方法名進行匹配的問題。我們來比較一下 Ruby 和 Java 語言中的多態性。

Java 的多態性

在 Java 語言中利用多態性的方式之一是聲明一個接口類型,并讓其他類型實現這個接口。然后就可以按照接口類型引用實現此接口的對象,并調用這個接口中存在的任何方法。例如,在清單 13 中,定義了一個簡單的接口 Filter


清單 13. 簡單的 Java 接口

在清單 14 中,定義了一個名為 RegexPackageFilter 的實現類,它應用一個正則表達式來進行過濾:


清單 14. RegexPackageFilter 實現了 Filter

現在,假設有 Filter 接口的多個實現(比如 RegexPackageFilterClassInclusionFilter 類型和 SimplePackageFilter 類型)。為了使應用程序的靈活性最大化,其他對象現在可以引用接口類型(Filter),而不是實現者,如清單 15 所示:


清單 15. 多態性非常酷

Ruby 多態性

在 Ruby 中沒有接口!只要方法名匹配,就可以利用多態性。看看吧。

在清單 16 中,用 Ruby 重新創建了 Java Filter 類型。注意,每個類之間并沒有關系(只不過它們都擁有同一個方法 apply_filter)。是的,這兩個類應該被重構以擴展 Filter 基類;但是,在這里我只是想展示在 Ruby 中如何利用多態性,而類并不共享相同的類型。


清單 16. 過濾我,Ruby!

注意在清單 16 中,可以通過 =~ 語法在 RegexFilterapply_filter() 方法中創建一個正則表達式匹配器。(如果您是 Groovy 用戶,就應該熟悉它;清單 16 說明 Groovy 受到了 Ruby 的強烈影響!)

duck typing 的表現

在清單 17 中,我使用 Ruby 的 Test::Unit(這就像 Java 的 JUnit)來演示 duck typing。順便說一句,在 Ruby 中建立自動測試只需擴展 Test::Unit 并添加以 test 開頭的方法。這與 JUnit 很相似,對嗎?


清單 17. 多態性過濾

注意,在 test_filters() 方法中,創建了一個包含兩個類 SimpleFilterRegexFilter 的集合。這些類并不共享同一個基類,但是在對集合進行迭代時,仍然可以簡單地調用 apply_filter() 方法。

還要注意 Ruby 多么輕松地支持正則表達式。要創建正則表達式,只需使用 / regex / 語法。因此,清單 17 中 RegexFilter 的正則表達式是一個大寫的 G,后面是一個或多個 o,最后是 gle。





回頁首


mix-in

Ruby 沒有接口,但是它有 mix-in。可以把 mix-in 看成多重繼承,但是它沒有 多重繼承的麻煩。mix-ins 是模塊(不能被實例化),其中包含類可以選擇包含的方法。這些模塊方法會變成包含它們的類的實例方法。

例如,在 JUnit 中,Assertion 類是一個具體的類,其中包含許多 static 斷言方法,我們熟悉的 TestCase 類會擴展這些方法。因此,任何 TestCase 實現類都可以在它自己的已定義方法中引用斷言方法。

Ruby 的單元測試框架有點兒不一樣。它并未定義 Assertion 類,而是定義了一個 Assertions 模塊。這個模塊定義了許多斷言方法,但是 Ruby 不對這個模塊進行擴展,Ruby 的 TestCase 類以 mix-in 的形式包含 assertion。因此,這些斷言方法現在都是 TestCase 上的實例方法,如 清單 17 所示。





回頁首


結束語

您已經看到,Ruby 的語法與 Java 語言很不一樣,但是非常容易掌握。另外,某些事情用 Ruby 做起來比用 Java 語言容易得多。

學習多種自然語言的經驗告訴我們,可以混合使用不同的編程語言是件好事兒。能夠用多種語言進行編程,使您在面對各種編程任務時具有更大的靈活性。這還會提升您的編程母語的價值。

正如在本文開頭所說的,我主要是 Java 開發人員,但是我發現有許多辦法可以將 Ruby(和 Groovy、Jython 等等)用在工作中。而且這么做的時候不需要使用 Rails!如果您放棄了 Ruby on Rails,因為您實際上不需要 在短時間內構建購物車應用程序,那么好好了解一下 Ruby 本身吧。我認為您會喜歡自己看到的東西。





回頁首


參考資料

學習
  • 您可以參閱本文在 developerWorks 全球站點上的 英文原文

  • Programming in the Ruby language” (Joshua Drake,developerWorks,2001 年 7 月):分為四部分的 Ruby 編程簡介。

  • Test-first Ruby programming” (Pat Eyler,developerWorks,2005 年 5 月):這個教程介紹用 Ruby 的 Test::Unit 庫進行單元測試。

  • 使用 Eclipse 插件 Ruby Development Tools” (Neal Ford,developerWorks,2005 年 10 月):一種在 Java 平臺和 Ruby 之間進行銜接的方式。

  • 使用 Ruby on Rails 快速開發 Web 應用程序” (David Mertz,developerWorks,2005 年 6 月):深入介紹這種小型平臺。

  • alt.lang.jre: Take a shine to JRuby” (Michael Squillace 和 Barry Feigenbaum,developerWorks,2004 年 9 月):要同時獲得 Smalltalk 的面向對象能力、Perl 的表達能力和 Java 類庫的靈活性嗎?那就試試 JRuby 吧!

  • Programming Ruby: The Pragmatic Programmer's Guide (David Thomas 和 Andrew Hunt;Addison-Wesley,2001 年):這本著名書籍的在線版本。

  • Ten things every Java programmer should know about Ruby (Jim Weirich,O'Reilly Open Source Convention,2005 年):從 Java 開發人員的視角了解 Ruby。

  • 實戰 Groovy系列 (Andrew Glover,developerWorks):學習 Groovy 的各個方面 —— 這是一種在 Ruby 的啟發下為 Java 平臺開發的語言。

  • Java 技術專區:數百篇關于 Java 編程所有方面的文章。


獲得產品和技術
  • Ruby 主頁:下載 Ruby。


討論
  • developerWorks blogs:加入 developerWorks 社區!




回頁首


關于作者

Andrew Glover 是 Vanward Technologies 的 CTO,這是一家 JNetDirect 公司。Vanward 通過有效的開發人員測試策略和框架、軟件測量分析和綜合以及持續集成,幫助軟件開發團隊和管理者持續監視代碼質量,從而幫助公司及早 解決軟件質量問題。他是 Java Testing Patterns(Wiley,2004 年 9 月)一書的合著者。



轉載于:https://www.cnblogs.com/jplee/archive/2006/12/04/581925.html

總結

以上是生活随笔為你收集整理的脱离 Rails 看 Ruby的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。