attr vs attr_accessor

时间:2012-12-19 17:42:52

标签: ruby oop

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

class Enterprise
  attr :dilithium, true

相同
class Enterprise
  attr_accessor :dilithium

两个函数attrattr_accessor或多或少都是多余的吗?

3 个答案:

答案 0 :(得分:29)

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

答案 1 :(得分:7)

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

答案 2 :(得分:1)

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

对我而言,主要区别在于:

写下{p> 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

如果:name:popularity位于同一行attr :name, :popularity,则会更难单独记录。

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