在使用 fetch 时,使用第二个参数设置默认值而不是使用自定义的逻辑。
batman = { name: 'Bruce Wayne', is_evil: false }
# bad - if we just use || operator with falsy value we won't get the expected result
batman[:is_evil] || true # => true
# good - fetch work correctly with falsy values
batman.fetch(:is_evil, true) # => false
尽量用 fetch 加区块而不是直接设定默认值。
batman = { name: 'Bruce Wayne' }
# bad - if we use the default value, we eager evaluate it
# so it can slow the program down if done multiple times
batman.fetch(:powers, get_batman_powers) # get_batman_powers is an expensive call
# good - blocks are lazy evaluated, so only triggered in case of KeyError exception
batman.fetch(:powers) { get_batman_powers }
当你需要从一个 hash 连续的取回一系列的值的时候使用 Hash#values_at。
# bad
email = data['email']
nickname = data['nickname']
# good
email, username = data.values_at('email', 'nickname')
记住, 在 Ruby1.9 中, 哈希的表现不再是无序的. (译者注: Ruby1.9 将会记住元素插入的序列)
当遍历一个集合的同时, 不要修改这个集合。










