22

在 Ruby 中,实例变量有四种不同的 getter 和 setter 方法attrattr_readerattr_writer、 和attr_accessor。问题是,在 Ruby中,如果传递了附加参数 true ,是否与attr :dilithium相同attr_reader :dilithium,并且相同?attr_accessor :dilithium也就是说是

class Enterprise
  attr :dilithium, true

相同

class Enterprise
  attr_accessor :dilithium

这两个功能或多或少是多余attr的吗?attr_accessor

4

3 回答 3

29

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

于 2012-12-19T17:45:29.340 回答
7

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

于 2012-12-19T18:13:03.813 回答
1

如果您查看 Ruby 2.3.0 中的 C 代码,您会看到这一点attr并且attr_reader实际上在做同样的事情(除了不推荐使用的代码路径)。它们本质上是等价的功能。

对我来说,主要区别是:

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

如果它们在同一条线上,则更难以记录:name和独立。:popularityattr :name, :popularity

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

于 2016-07-02T08:39:19.047 回答