Ruby 缓存处理的代码有没有优雅一点的写法?

yakczh · 2014年01月29日 · 最后由 sevk 回复于 2014年02月02日 · 2439 次阅读

缓存处理的逻辑一般是

if ( 缓存命中) {

返回缓存的内容

}else {

获取数据源 更新缓存的 key 返回数据源的值 }

但一沱一沱这样的代码到处写总觉得很难看,有没有优雅一点的写法?

cache[key] ||= fetch data

缓存可能是保存到文件,而且也有缓存时间判断

def my_cache(key)
  return cache[key] if modified?(key)
  yield
end

my_cache(key) do
  create_data
end

#2 楼 @yakczh 同样重复的代码提出个方法咯,[][]= 都可以重新定义的啊,存到哪里都没关系吧?

cache.fetch(key) do
   # balabala
end
匿名 #6 2014年02月02日

考虑下 memoize 方法。 我曾在这篇博客中分析过,几乎大部分的缓存操作都可以转换成 memoize 函数(不过停步,这篇只讲了 PHP 中的情形作为科普,Ruby、Python 中由于太普遍常见了我就没分析):http://jex.im/programming/memoization-in-php.html

Ruby 和 Python 中实现我文中说的那种优雅的 memoization 可方便多了。PHP 要折腾很多。

有个 Gem:Memoist。 曾经 Rails 中也有个模块:ActiveSupport::Memoize, 不过后来他们好像更推荐||=的方法了:http://www.railway.at/articles/2008/09/20/a-guide-to-memoization/

Google 搜索下“Ruby memoization”可以得到更多惯例用法

这里可以使用元编程了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号