2009-06-04 3 views
1

다른 메서드에 특정 메서드를 연기하거나 위임하는 메서드를 작성하려고하지만 코드가있는 경우에만 코드를 약간 마셔야합니다. 다음은 기본적인 아이디어입니다. Shipment < AbstractShipmentReroute < AbstractShipment 일 수 있습니다. Shipment 또는 Reroute 중 하나는 Delivery (또는 배송)이지만 둘 다 가질 수는 없습니다.별칭이 지정된 메서드에서 슈퍼를 호출하는 중

shipment.deliveries를 호출 할 때 우선 경로 변경이 있는지 확인하고 싶습니다. 그렇지 않다면 AbstractShipmentdeliveries 메소드를 호출하십시오. 그렇다면 리 라우트에 메소드를 위임하십시오.

나는 아래의 간단한 코드와 함께이 시도 :

module Kernel 
    private 
    def this_method 
     caller[0] =~ /`([^']*)'/ and $1 
    end   
end 

class Shipment < AbstractShipment 
    ... 

    def deferToReroute 
    if self.reroute.present? 
     self.reroute.send(this_method) 
    else 
     super 
    end 
    end 

    alias_method :isComplete?, :deferToReroute 
    alias_method :quantityReceived, :deferToReroute 
    alias_method :receiptDate, :deferToReroute 
end 

Kernel.this_method가 호출하는 방법을 알아내는 단지 편리합니다. 그러나 super를 호출하면 내가 조금 검색이 루비 1.8의 버그이지만 1.9에 고정되어 있음을 설명 this link을 발견

super: no superclass method `deferToReroute' 

가 발생합니다. 불행히도이 코드를 1.9로 업그레이드 할 수 없으므로 해결 방법에 대한 제안 사항이 있습니까? 내 코드에서 보는 조금, 나는 실제로 내가 한 모든 방법 별칭을 할 필요가 없습니다 실현 후, 나는 실제로에만 필요가 덮어 쓰기 :

편집 :-)

감사합니다 다른 세 사람이 계산을 위해 실제로 호출하기 때문에 전달 방법. 그러나, 나는 전에 이것에 부딪 쳤기 때문에 항상 너희들의 생각을 알고 싶다.

답변

2

오히려 여기 alias_method를 사용하는 것보다, 당신은 더 나은 하드 오버라이드 (override)과 같이, 이러한 방법에 의해 제공 될 수 있습니다

class Shipment < AbstractShipment 
    def isComplete? 
    return super unless reroute 
    reroute.isComplete? 
    end 
end 

당신은 클래스 당이 5 ~ 10 시간을 일을 발견하면, 당신은 그것을 만들 수 있습니다 친절과 같이 : 직선 평가를 사용

class Shipment < AbstractShipment 
    def self.deferred_to_reroute(*method_names) 
    method_names.each do |method_name| 
     eval "def #{method_name}; return super unless reroute; reroute.#{method_name}; end" 
    end 
    end 
    deferred_to_reroute :isComplete?, :quantityReceived, :receiptDate 
end 

good performance characteristics을 제공하고 당신이 당신의 클래스 정의 내에서 무엇을하고 있는지에 대한 간단한 선언적 구문을 가질 수 있습니다.

+0

굉장! 만약 내가 조금 더 오래 놀아왔다면 비슷한 것을 시도하는 플러그인을 작성했기 때문에 이런 식으로 시도했을 것입니다. 그러나 그것이 깨끗했을 것입니다. 매우 감사합니다 :-) –

관련 문제