2011-05-03 4 views
3

다형성 방식으로 덮어 쓰기의 구현에 따라 다른 메서드의 반환 값으로 동작을 변경하는 인스턴스 메서드를 만들고 싶습니다.다른 범위에서 정의 된 Proc에서 로컬 변수 참조하기

예를 들어, 다음 클래스는 확장되는 것으로 가정되며 제품에 따라 pricing_rule이 변경 될 것으로 예상됩니다.

class Purchase 
    def discount_price 
    prices = [100, 200, 300] 
    pricing_rule.call 
    end 
    protected 
    def pricing_rule 
     Proc.new do 
     rate = prices.size > 2 ? 0.8 : 1 
     total = prices.inject(0){|sum, v| sum += v} 
     total * rate 
     end 
    end 
end 
Purchase.new.discount_price 
#=> undefined local variable or method `prices' for #<Purchase:0xb6fea8c4> 

그러나 이것을 실행할 때 정의되지 않은 로컬 변수 오류가 발생합니다. Proc의 인스턴스가 Purchase 인스턴스를 참조하고 있음에도 불구하고 prices 변수를 discount_price 메소드에 배치해야하는 유사한 상황이 종종 발생했습니다. Proc의 호출자에서 지역 변수를 참조하는 더 똑똑한 방법이 있습니까?

답변

4

의 로컬 변수가 에 의해 반환 된 Proc 내부에서 액세스 할 수있을 것으로 기대하지 않습니다. prices을 입력하면 작동합니다.

class Purchase 
    def discount_price 
    prices = [100, 200, 300] 
    pricing_rule.call prices 
    end 
    protected 
    def pricing_rule 
     Proc.new do |prices| 
     rate = prices.size > 2 ? 0.8 : 1 
     total = prices.inject(0){|sum, v| sum += v} 
     total * rate 
     end 
    end 
end