我有几个班级都包含的模块。每个类为模块方法计算不同的百分比。
共享计算后,我想我会将它们抽象为单个模块以包含共享方法。但是,来自类的实例变量没有持久化到模块方法中。
因此,仅演示一下原理:
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
该类中定义的不会持久化到所包含的模块方法。为什么是这样?尤其是当普通的旧继承方法起作用时。
我的意思是我可以使它们成为全局变量,或者定义一个只返回一个百分比的方法。我以为真的很奇怪?以及在这种情况下的最佳做法是什么。我不想为此感到困惑的方法或任何全局变量。
提前致谢。
使用include
模块的方法时,可以在类的instance上运行。当你宣布@npat_percentage
你在你的类的静态情况下,它是没有实例可见宣布它。
您应该extend
改为使用,请参见此处:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句