Ruby: 延迟计算与优化

Ruby 的延迟计算大家已经用得很多了, 下面就是一个范例

class ApplicationController
  def current_user
    @current_user ||= User.where(:id => session[:user_id]).first
  end
end

class FooController < ApplicationController
  def foo
    current_user
    current_user
  end
end

但这个范例有一个问题, 如果 current_user 不存在, 那么每次调用 current_user 时都会额外查询一次数据库, 优化的方式就是用 instance_variable_defined? 先查询一下变量是否已经被定义, 测试范例如下

class A
  def foo
    puts "  expensive computing"
    nil
  end

  def failed_lazy
    @foo ||= foo
  end

  def successful_lazy
    return @bar if instance_variable_defined? "@bar"
    @bar = foo
  end

  def test
    puts "use failed lazy computing"
    (1..10).each {failed_lazy}
    puts "use successful lazy computing"
    (1..10).each {successful_lazy}
  end
end

A.new.test

测试结果如下

 
  
use failed lazy computing
expensive computing
expensive computing
expensive computing
expensive computing
expensive computing
expensive computing
expensive computing
expensive computing
expensive computing
expensive computing
use successful lazy computing
expensive computing
  • update1: 第一段的代码范例有错误: "||" 应该改为 "||=" 

转载于:https://www.cnblogs.com/lidaobing/archive/2011/02/26/optimize-lazy-evaluation-in-ruby.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值