attr vs attr_accessor

在Ruby中,实例变量有四种不同的getter和setter方法, attrattr_readerattr_writerattr_accessor 。 问题是,在Ruby attr :dilithium attr_reader :dilithium ,与attr_accessor :dilithium相同,并且与attr_accessor :dilithium相同,如果传递了一个额外的参数true? 那就是说

 class Enterprise attr :dilithium, true 

相同

 class Enterprise attr_accessor :dilithium 

两个函数attrattr_accessor多余还是多余?

一个区别是attr_accessor和朋友更清楚, attr的可选boolean参数现在已被弃用 。 除此之外,以及attr没有文档的事实,没有真正的区别。

在Ruby 1.8中, attr只能定义一个属性,可选的true表示创建一个setter。 在1.9中,它的行为类似于attr_reader :它允许多个属性。 正如@Linuxios所说,不推荐使用可选的布尔值。

如果你看一下Ruby 2.3.0中的C代码,你会发现attrattr_reader实际上是在做同样的事情(除了不推荐的代码路径)。 它们本质上是等效的function。

对我来说,主要的区别是:

attr更容易记下来,因为它更短。 我喜欢它在函数/不可变编程的上下文中的感觉(在那些上下文中, attr_writerattr_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

除此之外,它归结为个人偏好。 实际上没有性能差异或任何其他差异。