2010-01-03 5 views
1

내가루비에서 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 

같은 일부 코드에서 run_once 방법을 본 나는 커널에서 발견하지만 가정 내 생각 한 번 실행 함께 할 수있는 ... 뭔가 ...

+0

Mack 프레임 워크의 맥락에서입니까? (http://api.mackframework.com/mack/) – mikej

답변

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