如何在包含的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