Ruby on rails 当我们在Ruby和Rails中的一个类中定义了一些常量时,我们能保证能够在另一个类中访问它吗?

Ruby on rails 当我们在Ruby和Rails中的一个类中定义了一些常量时,我们能保证能够在另一个类中访问它吗?,ruby-on-rails,ruby,Ruby On Rails,Ruby,如果类定义中有一些常量: class Animal < ActiveRecord::Base GROWTH_FACTOR = 2 ... end 或 但有时不是吗?(因此它将随机失败,这取决于Rails服务器是否为特定HTTP请求重新运行Animal的类定义。)GROWTH\u FACTOR是否真正保证在每个类自己的定义中可用?如果我们想保证它是可用的,是在类中使用@@GROWTH\u FACTOR,然后在代码中的每个地方使用Animal.GROWTH\u FACTOR。在

如果类定义中有一些常量:

class Animal < ActiveRecord::Base
  GROWTH_FACTOR = 2

  ...
end



但有时不是吗?(因此它将随机失败,这取决于Rails服务器是否为特定HTTP请求重新运行
Animal
的类定义。)
GROWTH\u FACTOR
是否真正保证在每个类自己的定义中可用?如果我们想保证它是可用的,是在类中使用
@@GROWTH\u FACTOR
,然后在代码中的每个地方使用
Animal.GROWTH\u FACTOR

在您的示例中,“Animal”和“Plant”都是全局常量。只要对这些声明进行了求值,并且它们没有以某种方式未定义,就可以从任何地方访问它们,包括在类中定义的任何常量

如果这两个类是在名为“animal.rb”和“plant.rb”的文件中定义的,那么您可以通过
require
ing这些文件来确保这两个常量都可用。如果一个依赖于另一个,那么你需要文件的顺序就很重要了


现在在你问题的第二部分,你提到了一个不同的语法
@
,它不是一回事。除非您完全理解Ruby中类变量的含义,否则我不会使用这种语法。

动物的定义是否只有一个?不要使用类变量,尤其不要使用伪装成常量的所有caps。这不是它们的工作原理。为什么不定义一个
GrowthFactor
关注点,在那里你可以组织所有这些,然后在其他地方使用这些值呢?@tadman如果你知道这些常数永远不会改变呢?例如,如果它是
Phone
SCREEN_SIZE={iPhone5:{width:1080,height:1920},
,这应该是永远不会改变的?那么你的意思是如果我想要一个常量作为一个类
Animal::GROWTH_FACTOR
,那么这个方法或者
Animal.GROWTH_FACTOR
@@GROWTH_FACTOR
同样有效吗?它们确实不是常数,但它们都可以引用另一个对象,不是吗?我实际上没有看到任何
要求
,似乎有时有效,有时无效。。。顺便说一句,如果您需要一个
require
,但您没有它,那么其行为不应该是它总是出错并且不会运行吗?您可以将值存储在Ruby类变量中,但我会避免它们,除非您绝对确定您需要它们。被广泛接受的Ruby风格指南建议:您可能会成为重新加载行为的受害者(请参阅)。尝试在config/development.rb中设置
config.cache\u classes=true
,看看是否是这样。不过,您问题中的代码看起来不错。Rails应该为您自动加载动物。我们的项目使用Rails 3.x,因此没有“自动加载”模式(zeitwerk)。。。但这很奇怪,我们没有
要求“动物”
要求“植物”
但代码没有出错?或者它确实存在,但被异常处理程序捕获?奇怪的是,在我的ERB中,当我吐出要传递给JS端的常量时,有时静态HTML没有常量部分。。。是不是因为它不是自动加载的,而是导致了异常?这是否意味着控制器在呈现视图/部分视图之前应该
要求“…”
它?您在上一条评论中添加的第一个链接是关于类变量的,但是
动物::生长因子如何?这不是类变量,而是作为类的一部分的常量?
class Plant < ActiveRecord::Base
  GROWTH_FACTOR = Animal::GROWTH_FACTOR / 2.0

  ...
end
<%= Animal::GROWTH_FACTOR %>