在Ruby中,实例变量有四种不同的getter和setter方法,attr
,attr_reader
,attr_writer
和attr_accessor
。问题是,在Ruby attr :dilithium
中,与attr_reader :dilithium
相同,如果传递了额外的参数true,则与attr_accessor :dilithium
相同吗?也就是说
class Enterprise
attr :dilithium, true
与
相同class Enterprise
attr_accessor :dilithium
两个函数attr
和attr_accessor
或多或少都是多余的吗?
答案 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代码,你会发现attr
和attr_reader
实际上是在做同样的事情(除了不推荐的代码路径)。它们基本上是等效的功能。
对我而言,主要区别在于:
写下{p>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
和:popularity
位于同一行attr :name, :popularity
,则会更难单独记录。
除此之外,它归结为个人偏好。实际上没有性能差异或任何其他差异。