我在以下方面看到了很多不同的偏好:
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(
所以我会提倡不断使用