Time of Update: 2017-01-18
傾向數組及雜湊的字面標記法(除非你需要傳遞參數到它們的建構函式中)。 # bad arr = Array.new hash = Hash.new # good arr = [] hash = {} 當你需要元素為單詞(沒有空格和特殊符號)的數組的時候總是使用 %w 的方式來定義字串數組。應用這條規則僅僅在兩個或多個數組。 # bad STATES = ['draft', 'open', 'closed'] # good STATES = %
Time of Update: 2017-01-18
單個異常使用 fail 關鍵字僅僅當捕獲一個異常並且反覆拋出這個異常(因為這裡你不是失敗,而是準確的並且故意拋出一個異常)。 begin fail 'Oops' rescue => error raise if error.message != 'Oops' end 不要為 fail/raise 指定準確的 RuntimeError。 # bad fail RuntimeError, 'message'
Time of Update: 2017-01-18
在 class 定義裡使用一致的結構。 class Person # extend and include go first extend SomeModule include AnotherModule # constants are next SOME_CONSTANT = 20 # afterwards we have attribute macros attr_reader :name # followed
Time of Update: 2017-01-18
寫出自解釋文檔代碼,然後讓這部分歇息吧。這不是說著玩。 使用英文編寫注釋。 使用一個空格將注釋與符號隔開。 注釋超過一個單詞了,應句首大寫並使用標點符號。句號後使用 一個空格 避免多餘的注釋。 # bad counter += 1 # increments counter by
Time of Update: 2017-01-18
使用 :: 引用常量(包括類和模組)和構造器 (比如 Array() 或者 Nokogiri::HTML())。 永遠不要使用 :: 來調用方法。 # bad SomeClass::some_method some_object::some_method # good SomeClass.some_method some_object.some_method SomeModule::SomeClass::SOME_CONST
Time of Update: 2017-01-18
使用 UTF-8 作為源檔案編碼。 每個縮排層級使用兩個 spaces (又名軟 tabs). 不要硬 tabs # bad - four spaces def some_method do_something end # good def some_method do_something end 使用 Unix-風格 分行符號。(*BSD/Solaris/Linux/OSX
Time of Update: 2017-01-18
RVM 是一個命令列工具,可以提供一個便捷的多版本 Ruby 環境的管理和切換。https://rvm.io/如果你打算學習 Ruby / Rails, RVM 是必不可少的工具之一。這裡所有的命令都是再使用者權限下操作的,任何命令最好都不要用 sudo.RVM 安裝$ curl -L get.rvm.io | bash -s stable$ source ~/.bashrc$ source ~/.bash_profile修改 RVM 的 Ruby 安裝源到國內的
Time of Update: 2017-01-18
對於新入門的開發人員,如何安裝 Ruby, Ruby Gems 和 Rails 的運行環境可能會是個問題,本頁主要介紹如何用一條靠譜的路子快速安裝 Ruby 開發環境。次安裝方法同樣適用於產品環境!系統需求首先確定作業系統環境,不建議在 Windows 上面搞,所以你需要用: Mac OS X 任意 Linux 發行版本(Ubuntu,CentOS, Redhat, ArchLinux ...)
Time of Update: 2017-01-18
實現 Markdown 文法和代碼文法高亮分別是用的 Redcarpet 和 pygments.rb 兩個 Gem: https://github.com/vmg/redcarpet https://github.com/tmm1/pygments.rb https://github.com/richleland/pygments-css http://
Time of Update: 2017-01-18
顯性等待: wait = Selenium::WebDriver::Wait.new(:timeout => 3)wait.until { driver.find_element(:id => "cheese").displayed? } 隱性等待: driver = Selenium::WebDriver.for :firefoxdriver.manage.timeouts.implicit_wait = 3 #
Time of Update: 2017-01-18
Ruby的數組(arrays)和散列表(hashes)是被索引的收集(indexed collections).兩者都儲存物件的集合,通過鍵(key)來訪問。數組的鍵是整數。而散列表支援以任何對象作為它的鍵。數組和散列表會按需調整大小來儲存新的元素。訪問數組元素是高效的,但是散列表提供了靈活性。任何具體的數組或散列表可以儲存不同類型的對象。使用數組字面量(array literal)--即方括弧之間放一組元素--可以建立和初始化新的數組對象。有了數組對象,在方括弧之間提供索引便可以訪問單個元素,
Time of Update: 2017-01-18
Regex的內建支援通常只限於指令碼語言如Ruby,Perl和awk等,這是一個恥辱:儘管Regex很神秘,但它是一個強大的文本處理工具。通過內建而不是通過程式庫介面來支援它,有很大的不同。Regex只是一種指定字元模式的方法,這個字元模式會在字串中進行匹配。在Ruby中,通常在斜線之間(/pattern/)編寫入模式(pattern)來建立Regex。同時,Ruby就是Ruby,Regex是對象並且可以當作對象來操作。比如,可以使用如下的Regex來編寫入模式,它會匹配包含Perl或Pytho
Time of Update: 2017-01-18
繼承允許你建立一個類,作為另一個類的精鍊(refinement)和特化(specialization)。例如,在我們的自動點唱機系統中,有“歌曲”這一概念,被封裝在Song類中,然後,隨著市場的成長,我們需要提供卡拉OK的支援。一首卡拉OK歌曲和其他歌曲沒什麼兩樣(它只是沒有主唱的音軌,對此我們不必關心)。不過,它還包括對於的一套歌詞以及時間資訊。當我們的自動點唱機在播放一首卡拉OK歌曲時,歌詞應該隨音樂滾動顯示在點唱機前的螢幕上。解決這個問題的一種方法是定義一個新的類KaraokeSong,就
Time of Update: 2017-01-18
模組與類很相似,它也可以說成是“不能被執行個體化的類”。由於Class類是Module類的子類,所以說成是“類=模組+執行個體化能力”也許更好。所謂模組,究竟是用來幹什麼的呢?其作用主要有兩大類:Mix-in和命名空間。Mix-in實際上是受限制的多重繼承。利用實際做成的繼承關係,可以實現對某些類進行一些“點綴”的目的。事實上,Mix-in這種說法就來自於在冰激淩上面的餅乾或者堅果。在物件導向設計的曆史中,由多重繼承機製造成的問題早已眾所周知了。所以,很多現代的物件導向設計語言都只支援單一繼承的
Time of Update: 2017-01-18
當調用一個方法時,Ruby會做兩件事。1.找到這個方法。這個方法稱為方法尋找。2.執行這個方法。為了做到這點,Ruby需要一個叫做self的東西。這樣的一個過程--發現一個方法再執行之--在每種物件導向語言中都會發生。不過,對於像Ruby這樣非常動態語言,深入理解這個過程顯得尤為重要。你有沒有好奇過一個方法究竟定義在哪裡呢?如果有,那絕對應該深入理解方法尋找及self。當調用一個方法時,Ruby會在對象的類中尋找那個方法。不過,在給出更複雜的例子之前,你需要瞭解兩個新概念:接收者(receive
Time of Update: 2017-01-18
當你需要加入一個或多個動作至一個 RESTful 資源時(你真的需要嗎?),使用 member and collection 路由。 # 差 get 'subscriptions/:id/unsubscribe' resources :subscriptions # 好 resources :subscriptions do get 'unsubscribe', on: :member end # 差 get 'photos/search' resources
Time of Update: 2017-01-18
避免無限迴圈的元編程。 寫一個函數庫時不要使核心類混亂(不要使用 monkey patch)。 代碼塊形式最好用於字串插值形式。 當你使用字串插值形式,總是提供 __FILE__ 和 __LINE__,使得你的回溯有意義。 class_eval 'def use_relative_model_naming?; true;
Time of Update: 2017-01-18
需要插值與嵌入雙引號的單行字串使用 %() (是 %Q 的簡寫)。多行字串,最好用 heredocs 。 # bad (no interpolation needed) %(<div class="text">Some text</div>) # should be '<div class="text">Some text</div>' # bad (no double-quotes) %(This
Time of Update: 2017-01-18
如果只是需要中尋找字串的 text, 不要使用Regex:string['text'] 針對簡單的結構, 你可以直接使用string[/RE/]的方式來查詢. match = string[/regexp/] # get content of matched regexp first_group = string[/text(grp)/, 1] # get content of captured
Time of Update: 2017-01-18
優先使用 字串插值 來代替 字串串聯。 # bad email_with_name = user.name + ' <' + user.email + '>' # good email_with_name = "#{user.name} <#{user.email}>" # good email_with_name = format('%s <%s>', user.name, user.email)