Domanda

Voglio creare un metodo di istanza che varia il suo comportamento con il valore restituito di un altro metodo a seconda dell'implementazione delle sue sovrascritture in modo polimorfico.

Ad esempio, si presuppone che la seguente classe sia estesa e pricing_rule dovrebbe cambiare a seconda del prodotto.

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>

Ma ricevo un errore di variabile locale non definita quando lo eseguo.Anche se capisco che l'istanza di Proc si riferisce a un'istanza di Purchase, a volte mi sono imbattuto in situazioni simili che devo inserire prices variabile nel metodo discount_price.Esiste un modo più intelligente per fare riferimento alla variabile locale in un chiamante di un Proc?

È stato utile?

Soluzione

Non me lo aspetterei discount_pricele variabili locali siano accessibili all'interno del file Proc restituito da pricing_rule.Passando prices funzionerà:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top