我有一个模块,我包含在几个类中。每个类计算模块方法的不同百分比。
有了共享的计算我认为我会将它们抽象为一个单一的模块来包含共享方法。但是类中的实例变量并没有持久存在于模块方法中。
所以只是为了证明这个原则:
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
不会持久存在于模块中包含的方法。为什么是这样?特别是当只是普通的旧继承方法工作时。
我的意思是我可以假设让它们成为全局变量或定义一个只返回百分比的方法。我觉得这真的很奇怪?在这种情况下,最好的做法是什么。我不想让混乱的方法或任何全局变量。
提前致谢。
答案 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