如何让实例变量在包含的Ruby模块中持久存在

传奇

我有几个班级都包含的模块。每个类为模块方法计算不同的百分比。

共享计算后,我想我会将它们抽象为单个模块以包含共享方法。但是,来自类的实例变量没有持久化到模块方法中。

因此,仅演示一下原理:

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

模块中定义的方法可以正常工作,它可以scorecardEnterpriseDevelopment类中拾取诸如对象之类的东西,然后GenericEnterpriseDevelopment通过继承将其提供给该类的子对象,并且可以正常工作。

仅当我calculated_npat在模块内调用该方法时,@npat_percentage它才会返回0。因此,似乎@npat_percentage该类中定义的不会持久化到所包含的模块方法。为什么是这样?尤其是当普通的旧继承方法起作用时。

我的意思是我可以使它们成为全局变量,或者定义一个只返回一个百分比的方法。我以为真的很奇怪?以及在这种情况下的最佳做法是什么。我不想为此感到困惑的方法或任何全局变量。

提前致谢。

乌里·阿加西(Uri Agassi)

使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使类变量在VBA中的模块之间持久存在

如何使实例在Sinatra中的请求之间持久存在?

如何使Windows 7 ReadyBoost持久存在?

如何使python变量在markdown笔记本的各个块之间持久存在?

如何全局配置gtag中的维度/指标,以使其不会持久存在每个事件

在Amazon EC2实例上,什么持久存在,什么不持久?

TeamCity配置不会在Docker中持久存在

Ruby mixin - 访问类实例中的模块实例变量

如何从 Ruby 中的实例方法访问模块?

如何从被调用的模块中更新实例变量

如何从Redux持久存储中读取(localstorage)

Kubernetes 中持久存储的回收策略如何工作?

如何在FlowDocument段落中持久存储样式信息?

如何在iOS中持久存储信息?

如何在 Ruby 的扩展模块中使用类实例变量?

如何持久存储NSManagedObjectID?

如何访问Ruby块中的实例变量?

是否可以通过bash脚本更改环境变量的值,使其持久存在?

流星服务器端变量在方法之间持久存在

永久存储实例变量

如何清除 AWS SageMaker 上笔记本实例的持久存储?

模型实例固定装置未持久存储在数据库中

WebForms 中的对象是否持久存在于内存中?

如何观察Core Data持久存储在包含应用程序和扩展程序之间的变化

如何在休眠状态下持久存在实体期间验证对实体的约束

通过srcdoc更新后,iframe删除CSS-如何使添加的CSS持久存在

Docker:Alpine Linux:为什么apk add <package>在容器中持久存在?

当ID为null并在数据库中自动生成时持久存在实体

为什么MariaDB数据在我的Docker容器中持久存在?我没有书