Ruby中有实例变量,四种不同的getter和setter方法attr
, attr_reader
, attr_writer
,和attr_accessor
。 现在的问题是,在红宝石attr :dilithium
,同attr_reader :dilithium
,和相同的attr_accessor :dilithium
,如果一个附加参数传入true? 也就是说是
class Enterprise
attr :dilithium, true
相同
class Enterprise
attr_accessor :dilithium
在两个功能attr
和attr_accessor
或多或少冗余?
一个区别是, attr_accessor
和朋友更加清晰,并且可选的布尔参数attr
现已弃用 。 除此之外,这其实attr
没有文件,没有真正的区别。
在Ruby 1.8, attr
可以定义只有一个属性,一个可选的true
创造一个二传手。 在1.9它像attr_reader
:它允许多个属性。 作为@Linuxios说,在可选的布尔已经过时了。
如果你看一下在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
和:popularity
独立,如果他们在同一行attr :name, :popularity
。
除此之外,它归结为个人喜好。 有一个在实践中没有性能差异或其他任何区别。