Ruby 为什么在访问 hash 的时候用 fetch 而不用 [ ]

mobiwolf · 2012年03月08日 · 最后由 hooopo 回复于 2012年03月08日 · 5029 次阅读

访问 hash 的时候,可用用 [:key] 这样的符号,也可以用 fetch(:key),但是很多时候为什么建议都是用后者呢?

key 的 value 不存在的时候,fetch 可设置默认值,做些处理。

我没用过后者……

@Rei 我看一些 ruby 的书籍,都是建议使用 fetch

用 [ ] 访问 hash,在形式上比较直观。在 value 值不存在时,返回 nil。 用 fetch 的默认形式,在 value 值不存在时,会抛出异常。另外,如同@ming 所说,在在 value 值不存在时,可以做一些处理。

用 fetch 比较利于排错。比如说,某个 value 不存在,它就直接抛出异常了。[ ] 则是返回 nil. 但是,看代码,用 [ ] 的形式还是很多的。

需要默认值的时候我都是这样用的

do_something options[:key] || default


fetch 用在你知道某个值一定应该存在的时候,如果不存在就说明代码出问题了。 如果用 [],会返回 nil,不会报错。以后再来个 xxx is not defined for NilObject 这样比较让人困惑的错误

我也是 #5 楼 那样,或者用 try 方法

#5 楼 @Rei 其实这个 fetch 很强大的:-)

实现一个简单的 Read Throuth Cache:

DB = {:a => 1, :b => 2, :c => 3}

$cache = {}

def get_cache(key)
  hit = true
  $cache.fetch(key) do |x|
    hit = false
    puts "miss cache"
    value = DB[key]
    $cache[key] = value
    puts "set cache"
    value
  end
  puts "hit cache" if hit
end

puts get_cache(:a)

p $cache 

puts get_cache(:a) 


差不多可以和 Rails.cache 兼容了,除了缓存共享..

mobiwolf Hash.new 的疑问 中提及了此贴 04月03日 10:56
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册