ATTR VS attr_accessor(attr vs attr_accessor)

2019-07-17 11:06发布

Ruby中有实例变量,四种不同的getter和setter方法attrattr_readerattr_writer ,和attr_accessor 。 现在的问题是,在红宝石attr :dilithium ,同attr_reader :dilithium ,和相同的attr_accessor :dilithium ,如果一个附加参数传入true? 也就是说是

class Enterprise
  attr :dilithium, true

相同

class Enterprise
  attr_accessor :dilithium

在两个功能attrattr_accessor或多或少冗余?

Answer 1:

一个区别是, attr_accessor和朋友更加清晰,并且可选的布尔参数attr现已弃用 。 除此之外,这其实attr没有文件,没有真正的区别。



Answer 2:

在Ruby 1.8, attr可以定义只有一个属性,一个可选的true创造一个二传手。 在1.9它像attr_reader :它允许多个属性。 作为@Linuxios说,在可选的布尔已经过时了。



Answer 3:

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

对我来说,主要区别是:

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

除此之外,它归结为个人喜好。 有一个在实践中没有性能差异或其他任何区别。



文章来源: attr vs attr_accessor
标签: ruby oop