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
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: 第一段的代码范例有错误: "||" 应该改为 "||="