Ruby 类级别 字符串管理,变量与方法



我在以下方面看到了很多不同的偏好:

class Foo
  VAR = "Some string".freeze
  # or 
  def self.var
    "Some String"
  end
end

两者都可以通过相同的方式访问:

Foo::VAR 
#=> "Some String"
Foo::var
#=> "Some String"

但是,如果它是一个方法,您也可以Foo.var获取相同的字符串。 将其定义为变量感觉就像您打破了OO赋予我们的封装功能。但是,我看到很多字符串/幻数存储在类的变量中,这似乎是一种更常见的做法。

我不确定哪个是对的。

编辑对不起,我的问题有点令人困惑。我想找出将字符串存储在方法中是否更好,而不是将它们存储在类的变量中更好。我解释如何调用这些方法混淆了这个问题。

根据您的

问题,将immutable string存储在CONSTANT中更有意义。存储在CONSTANT中具有基本目的,即一个常量,可用于您lexical scope(s)中的所有人。

就个人而言,将"Some String"存储在方法中是浪费资源,因为每次调用self.var时,我们都会再次初始化接收器,这在这种情况下并不理想。我这么说是因为在Ruby中Scope Gate起着巨大的作用,并且由于其动态性质以及每次访问class及其methods时,您都会进入一个新的范围。这里也提出了一个类似的问题。

首先,使用常量可以保证子类不仅使用相同的字符串,还使用相同的对象。

  class Bar < Foo; end
  Foo::VAR.object_id == Bar::VAR.object_id # => true

其次,用::语法调用类方法非常混乱,约定是使用.(见 https://github.com/bbatsov/ruby-style-guide#double-colons(

所以我会提倡不断使用

最新更新