attr vs attr_accessor
在Ruby中,实例变量有四种不同的getter和setter方法, attr
, attr_reader
, attr_writer
和attr_accessor
。 问题是,在Ruby attr :dilithium
attr_reader :dilithium
,与attr_accessor :dilithium
相同,并且与attr_accessor :dilithium
相同,如果传递了一个额外的参数true? 那就是说
class Enterprise attr :dilithium, true
相同
class Enterprise attr_accessor :dilithium
两个函数attr
和attr_accessor
多余还是多余?
一个区别是attr_accessor
和朋友更清楚, attr
的可选boolean参数现在已被弃用 。 除此之外,以及attr
没有文档的事实,没有真正的区别。
在Ruby 1.8中, attr
只能定义一个属性,可选的true
表示创建一个setter。 在1.9中,它的行为类似于attr_reader
:它允许多个属性。 正如@Linuxios所说,不推荐使用可选的布尔值。
如果你看一下Ruby 2.3.0中的C代码,你会发现attr
和attr_reader
实际上是在做同样的事情(除了不推荐的代码路径)。 它们本质上是等效的function。
对我来说,主要的区别是:
attr
更容易记下来,因为它更短。 我喜欢它在函数/不可变编程的上下文中的感觉(在那些上下文中, attr_writer
和attr_accessor
是无关紧要的,因此使用attr_reader
感觉冗长和冗余)。
具有多个实例变量的attr
使得难以记录,除非在非常特定的情况下,例如
# The coordinates in WGS84. attr :x, :y # The location name. attr :name # The popularity of the location. attr :popularity
如果它们位于同一行attr :name, :popularity
则更难记录:name
和:popularity
attr :name, :popularity
。
除此之外,它归结为个人偏好。 实际上没有性能差异或任何其他差异。