访问 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 兼容了,除了缓存共享..