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

如何在包含的Ruby模块中保持实例变量,ruby,variables,module,persistence,Ruby,Variables,Module,Persistence,我有一个模块,我包括在几个类。每个类为模块方法计算不同的百分比 有了共享的计算,我想我会把它们抽象成一个单一的模块,包括共享的方法。但是类中的实例变量不会持久化到模块方法中 因此,为了证明这一原则: module Models::CharteredAccountancyMethods def calculated_npat_or_calculated_revenue [calculated_npat, calculated_revenue].max end .... ....

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

有了共享的计算,我想我会把它们抽象成一个单一的模块,包括共享的方法。但是类中的实例变量不会持久化到模块方法中

因此,为了证明这一原则:

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
本模块分为三类。所有这些都需要
computed\u npat\u或\u computed\u revenue
方法

一个类的示例:

class CharteredAccountancyGenericEnterpriseDevelopment < GenericEnterpriseDevelopment
  include Models::CharteredAccountancyMethods
  @npat_percentage = 0.03
  @revenue_percentage = 0.00375
  ....
  ....
end
class-charteredAccountancygenericeEnterpriseDevelopment
模块中定义的方法工作正常—它从
EnterpriseDevelopment
类中拾取
scorecard
对象,然后通过继承将其交给其子对象
GenericEnterpriseDevelopment
类,工作正常

仅当我在模块内调用
@npat\u computed\u npat
方法时,
@npat\u percentage
将返回0。因此,似乎类中定义的
@npat_百分比
没有持久化到包含的模块方法。为什么会这样?特别是当简单的旧继承方法起作用时

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


提前感谢。

当您使用
include
时,模块的方法将在类的实例上运行。当您声明
@npat_percentage
时,您是在类的静态上下文中声明它的,在那里实例看不到它

您应该使用
extend
,请参见:


非常感谢您的链接,它帮助我理解了extend和include之间的区别。
class CharteredAccountancyGenericEnterpriseDevelopment < GenericEnterpriseDevelopment
  extend Models::CharteredAccountancyMethods
  @npat_percentage = 0.03
  @revenue_percentage = 0.00375
  ....
  ....
end
class CharteredAccountancyGenericEnterpriseDevelopment < GenericEnterpriseDevelopment
  include Models::CharteredAccountancyMethods

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