集合
-
倾向数组及哈希的字面表示法(除非你需要给构造器传入参数)。
# 差 arr = Array.new hash = Hash.new # 好 arr = [] hash = {}
-
创建元素为单词(没有空格和特殊符号)的数组时,用
%w
而不是 [] 方法。仅当数组有两个及以上元素时才应用这个规则。# 差 STATES = ['draft', 'open', 'closed'] # 好 STATES = %w(draft open closed)
-
当你需要一个符号的数组(并且不需要保持 Ruby 1.9 兼容性)时,使用
%i
。仅当数组只有两个及以上元素时才应用这个规则。# 差 STATES = [:draft, :open, :closed] # 好 STATES = %i(draft open closed)
-
避免在
Array
和Hash
字面量中的最后一个元素后面使用逗号。特别是元素同一行的情况下# 差 - 方面移动、增加和修改参数,但仍不建议使用 VALUES = [ 1001, 2020, 3333, ] # 差 VALUES = [1001, 2020, 3333, ] # 好 VALUES = [1001, 2020, 3333]
-
避免在数组中创造巨大的间隔。
arr = [] arr[100] = 1 # 现在你有一个很多 nil 的数组
-
当访问数组的首元素或尾元素时,尽量使用
first
或last
, 而非[0]
或[-1]
。 -
当处理的元素没有重复时,使用
Set
来替代Array
。Set
实现了无序、无重复值的集合。Set
的方法同数组类一样直观,还可像哈希中那样快速查找元素。 -
尽量用符号来取代字符串作为哈希的键。
# 差 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?
。松本提到过已经不推荐使用较长的形式了。# 差 hash.has_key?(:test) hash.has_value?(value) # 好 hash.key?(:test) hash.value?(value)
-
在处理应该存在的哈希键时,使用
Hash#fetch
。heroes = { batman: 'Bruce Wayne', superman: 'Clark Kent' } # 差 - 如果我们打错字的话,我们就无法找到对的英雄了 heroes[:batman] # => "Bruce Wayne" heroes[:supermen] # => nil # 好 - fetch 会抛出一个 KeyError 来使这个问题明显 heroes.fetch(:supermen)
-
在使用
Hash#fetch
时,使用第二个参数设置默认值。batman = { name: 'Bruce Wayne', is_evil: false } # 差 - 如果我们仅仅使用 || 操作符,那么当值为假时,我们不会得到预期的结果 batman[:is_evil] || true # => true # 好 - fetch 在遇到假值时依然正确 batman.fetch(:is_evil, true) # => false
-
如果求值的代码有副作用或者开销大,尽量用
Hash#fetch
加区块而不是直接设定默认值。batman = { name: 'Bruce Wayne' } # 差 - 默认值是立即求值 batman.fetch(:powers, obtain_batman_powers) # obtain_batman_powers 需要复杂的计算 # 好 - 区块是惰性求职,只有当 KeyError 异常时才执行 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
调用[]
。# 差 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
更多建议: