2

lambdas의 해시로 구현 된 디스패치 테이블이 Ruby의 method_missing을 오버 라이딩하는 것보다 좋지 않더라도 좋을지는 모르는가요?루비에서 디스패치 테이블이 method_missing만큼 좋은가요?

http://en.wikipedia.org/wiki/Dispatch_table

을 : 참조), 나는 루비와 비교 초보자 해요,하지만 이전에 펄 배경을 가지고 있고, 위키 백과에서 파견 테이블 예 심지어 Perl로 구현 나는 오늘이 기술을 사용하기 때문에 내가 부탁 해요

어떤 경우에도 method_missing 대신 디스패치 테이블을 사용하면 어떤 단점이 있습니다. 아래의 Ruby 코드가 단서를 제공합니까? 내 디스패치 테이블이 상당히 커질 수 있으며 다른 컨텍스트에서 사용하기 위해 포함 된 람다에 액세스 할 수있는 방법이 없습니다. 그래서 어쩌면, 나는 어느 정도 내 질문에 대답 해요,하지만 난 디스패치 테이블 method_missing 또는 다른 메타 프로그래밍 기술보다 더 나은 솔루션이 될 수있는 경우에 정말 관심 덕분에

def dispatch_self_and_modified_ancestors(key, value, work_effort) 
    dispatch_table = { 
     :scheduled_completion_date => lambda {|work_effort, updated_value| 
      modified_ancestors = [] 

      while work_effort.parent 
       work_effort = work_effort.parent 
       if updated_value > work_effort.scheduled_completion_date 
        work_effort.scheduled_completion_date = updated_value 
        work_effort.save 
        modified_ancestors.push work_effort 
       else 
        break 
       end 
      end 

      return modified_ancestors 
     } 
    } 

    if dispatch_table.has_key?(key) 
     return dispatch_table[key].call(work_effort, value) 
    else 
     return [] 
    end 
end 
+0

감사합니다, 그것은 나에게 다시 인수 분해 아이디어를 부여하고있다. 예를 들어 위의 새 람다를 추가하면 빈 "modified_ancestors"를 초기화 한 다음 동일한 값을 반환하므로 개별 람다 외부로 이동할 수있는 "상태"가됩니다. –

답변

2

자주 뭔가를 호출하는 경우 method_missing에 의해 발견되면 존재하지 않는 메소드를 찾는 행위가 결국 코드에서 성능 문제가 될 수 있습니다. 따라서 디스패치 테이블은이를 해결하는 한 가지 방법 일 수 있습니다.

여기를 최적화하는 성능 method_missing의 문제와 시도를 설명하는 좋은 기사입니다 : 나는 당신의 의견은 대답을했다 할 http://www.alef1.org/ruby/method_missing/