集合

2018-02-24 16:10 更新
  • 傾向數(shù)組及哈希的字面表示法(除非你需要給構(gòu)造器傳入?yún)?shù))。

    # 差
    arr = Array.new
    hash = Hash.new
    
    # 好
    arr = []
    hash = {}
  • 創(chuàng)建元素為單詞(沒有空格和特殊符號)的數(shù)組時,用?%w?而不是 [] 方法。僅當數(shù)組有兩個及以上元素時才應(yīng)用這個規(guī)則。

    # 差
    STATES = ['draft', 'open', 'closed']
    
    # 好
    STATES = %w(draft open closed)
  • 當你需要一個符號的數(shù)組(并且不需要保持 Ruby 1.9 兼容性)時,使用?%i。僅當數(shù)組只有兩個及以上元素時才應(yīng)用這個規(guī)則。

    # 差
    STATES = [:draft, :open, :closed]
    
    # 好
    STATES = %i(draft open closed)
  • 避免在?Array?和?Hash?字面量中的最后一個元素后面使用逗號。特別是元素同一行的情況下

    # 差 - 方面移動、增加和修改參數(shù),但仍不建議使用
    VALUES = [
           1001,
           2020,
           3333,
         ]
    
    # 差
    VALUES = [1001, 2020, 3333, ]
    # 好
    VALUES = [1001, 2020, 3333]
  • 避免在數(shù)組中創(chuàng)造巨大的間隔。

    arr = []
    arr[100] = 1 # 現(xiàn)在你有一個很多 nil 的數(shù)組
  • 當訪問數(shù)組的首元素或尾元素時,盡量使用?first?或?last, 而非?[0]?或?[-1]。

  • 當處理的元素沒有重復(fù)時,使用?Set?來替代?Array?。?Set?實現(xiàn)了無序、無重復(fù)值的集合。?Set?的方法同數(shù)組類一樣直觀,還可像哈希中那樣快速查找元素。

  • 盡量用符號來取代字符串作為哈希的鍵。

    # 差
    hash = { 'one' => 1, 'two' => 2, 'three' => 3 }
    
    # 好
    hash = { one: 1, two: 2, three: 3 }
  • 避免使用可變的對象作為鍵值。

  • 當哈希的鍵為符號時,使用 Ruby 1.9 的哈希的字面語法。

    # 差
    hash = { :one => 1, :two => 2, :three => 3 }
    
    # 好
    hash = { one: 1, two: 2, three: 3 }
  • 但哈希的鍵有符號也有字符串時,不使用Ruby 1.9的字面量語法。

    # 差
    { a: 1, 'b' => 2 }
    
    # 好
    { :a => 1, 'b' => 2 }
  • 用?Hash#key?。不用?Hash#has_key?。用?Hash#value?。不用?Hash#has_value?。松本提到過已經(jīng)不推薦使用較長的形式了。

    # 差
    hash.has_key?(:test)
    hash.has_value?(value)
    
    # 好
    hash.key?(:test)
    hash.value?(value)
  • 在處理應(yīng)該存在的哈希鍵時,使用?Hash#fetch

    heroes = { batman: 'Bruce Wayne', superman: 'Clark Kent' }
    # 差 - 如果我們打錯字的話,我們就無法找到對的英雄了
    heroes[:batman] # => "Bruce Wayne"
    heroes[:supermen] # => nil
    
    # 好 - fetch 會拋出一個 KeyError 來使這個問題明顯
    heroes.fetch(:supermen)
  • 在使用?Hash#fetch?時,使用第二個參數(shù)設(shè)置默認值。

    batman = { name: 'Bruce Wayne', is_evil: false }
    
    # 差 - 如果我們僅僅使用 || 操作符,那么當值為假時,我們不會得到預(yù)期的結(jié)果
    batman[:is_evil] || true # => true
    
    # 好 - fetch 在遇到假值時依然正確
    batman.fetch(:is_evil, true) # => false
  • 如果求值的代碼有副作用或者開銷大,盡量用?Hash#fetch?加區(qū)塊而不是直接設(shè)定默認值。

    batman = { name: 'Bruce Wayne' }
    
    # 差 - 默認值是立即求值
    batman.fetch(:powers, obtain_batman_powers) # obtain_batman_powers 需要復(fù)雜的計算
    
    # 好 - 區(qū)塊是惰性求職,只有當 KeyError 異常時才執(zhí)行
    batman.fetch(:powers) { obtain_batman_powers }
  • 當需要從哈希中同時獲取多個鍵值時,使用?Hash#values_at。

    # 差
    email = data['email']
    username = data['nickname']
    
    # 好
    email, username = data.values_at('email', 'nickname')
  • Ruby 1.9 的哈希是有序的,利用這個特性。

  • 在遍歷一個集合時,不要改動它。

  • 當訪問集合中的元素時,避免通過?[n]?直接訪問,盡量使用提供的方法。這樣可以防止你對?nil?調(diào)用?[]。

    # 差
    Regexp.last_match[1]
    
    # 好
    Regexp.last_match(1)
  • 為集合提供存取器時,在訪問元素之前采用一種替代的形式,從而防止用戶訪問的下標是?nil。

    # 差
    def awesome_things
      @awesome_things
    end
    
    # 好
    def awesome_things(index = nil)
      if index && @awesome_things
        @awesome_things[index]
      else
        @awesome_things
      end
    end
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號