2010-01-03 79 views
1

我已经看到了一些代码的run_once方法类似ruby​​中的run_once是什么?

run_once do 
    [:hello, :core, :gems, :plugins, :lib, :initializers, :routes, :app, :helpers].each do |f| 
    require File.join_from_here('mack', 'boot', "#{f}.rb") 
    end 
end 

我发现它在内核中,但不知道它做什么?是与运行一次,我猜...

+0

这是在Mack框架的上下文吗? (http://api.mackframework.com/mack/) – mikej 2010-01-03 00:21:45

回答

1

假设这是我们正在谈论的Mack Facets run_once方法,这里是它的源:

def run_once 
    path = File.expand_path(caller.first) 
    unless ($__already_run_block ||= []).include?(path) 
    yield 
    $__already_run_block << path 
    end 
    # puts "$__already_run_block: #{$__already_run_block.inspect}" 
end 

你会调用不带参数的方法,但经过一个街区。 run_once将从调用堆栈(caller.first)的第一个条目中确定调用它的代码点。如果run_once还没有从该呼叫点被呼叫(通过保持呼叫点在全球阵列中的列表$__already_run_block

例如,它可以沿着这些线使用:

def initialise 
    run_once do 
    # any code here will only execute the first time initialise is called 
    # and will be skipped on subsequent calls to initialise 
    end 
end