在Ruby中,有四种不同的getter和setter方法,分别用于实例变量attr
、attr_reader
、attr_writer
和attr_accessor
。问题是,在Ruby attr :dilithium
中,如果传递一个额外的参数true,是否与attr_reader :dilithium
相同,并与attr_accessor :dilithium
相同?也就是说,
class Enterprise
attr :dilithium, true
等同于
class Enterprise
attr_accessor :dilithium
attr
和attr_accessor
这两个函数是更多还是更少冗余?
发布于 2012-12-20 01:45:29
一个不同之处在于attr_accessor
和friends更加清晰,并且attr
的可选布尔参数现在是deprecated。除此之外,attr
没有文档这一事实,没有什么真正的区别。
发布于 2012-12-20 02:13:04
在Ruby1.8中,attr
只能定义一个属性,并使用一个可选的true
来创建setter。在1.9中,它的行为类似于attr_reader
:它允许多个属性。正如@Linuxios所说,可选的布尔值已被弃用。
发布于 2016-07-02 16:39:19
如果你看一下Ruby2.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
和:popularity
在同一行attr :name, :popularity
上,那么将很难独立地记录它们。
除此之外,这可以归结为个人喜好。实际上,没有性能差异或任何其他差异。
https://stackoverflow.com/questions/13958061
复制相似问题