如何在包含的Ruby模块中保留实例变量

时间:2014-05-28 12:10:00

标签: ruby variables module persistence

我有一个模块,我包含在几个类中。每个类计算模块方法的不同百分比。

有了共享的计算我认为我会将它们抽象为一个单一的模块来包含共享方法。但是类中的实例变量并没有持久存在于模块方法中。

所以只是为了证明这个原则:

module Models::CharteredAccountancyMethods
  def calculated_npat_or_calculated_revenue
    [calculated_npat, calculated_revenue].max
  end

....
....

  def calculated_npat
    return 0 if @npat_percentage.to_f.zero?
    return scorecard.npat.to_f * @npat_percentage.to_f
  end

  def calculated_revenue
    return 0 if @revenue_percentage.to_f.zero? 
    return scorecard.general.revenue.to_f * @revenue_percentage.to_f
  end
end

该模块包含在3个类中。所有这些都需要calculated_npat_or_calculated_revenue方法。

班级的一个例子:

class CharteredAccountancyGenericEnterpriseDevelopment < GenericEnterpriseDevelopment
  include Models::CharteredAccountancyMethods
  @npat_percentage = 0.03
  @revenue_percentage = 0.00375
  ....
  ....
end

模块中定义的方法可以很好地从scorecard类中获取EnterpriseDevelopment对象之类的东西,然后将其赋予它GenericEnterpriseDevelopment的子对象。通过继承类,并且工作正常。

只有当我在模块中调用calculated_npat方法时,@npat_percentage才会返回0.因此,似乎类中定义的@npat_percentage不会持久存在于模块中包含的方法。为什么是这样?特别是当只是普通的旧继承方法工作时。

我的意思是我可以假设让它们成为全局变量或定义一个只返回百分比的方法。我觉得这真的很奇怪?在这种情况下,最好的做法是什么。我不想让混乱的方法或任何全局变量。

提前致谢。

1 个答案:

答案 0 :(得分:1)

当您使用include模块的方法在您的班级的实例上运行时。当你声明@npat_percentage时,你在你的类的静态上下文中声明了它,它在实例中是不可见的。

您应该使用extend代替here

class CharteredAccountancyGenericEnterpriseDevelopment < GenericEnterpriseDevelopment
  extend Models::CharteredAccountancyMethods
  @npat_percentage = 0.03
  @revenue_percentage = 0.00375
  ....
  ....
end

或者,在def initialize方法中设置变量:

class CharteredAccountancyGenericEnterpriseDevelopment < GenericEnterpriseDevelopment
  include Models::CharteredAccountancyMethods

  def initialize
    @npat_percentage = 0.03
    @revenue_percentage = 0.00375
  end
  ....
  ....
end