傾向數(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
更多建議: