首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >attr vs attr_accessor

attr vs attr_accessor
EN

Stack Overflow用户
提问于 2012-12-20 01:42:52
回答 3查看 11.1K关注 0票数 22

在Ruby中,有四种不同的getter和setter方法,分别用于实例变量attrattr_readerattr_writerattr_accessor。问题是,在Ruby attr :dilithium中,如果传递一个额外的参数true,是否与attr_reader :dilithium相同,并与attr_accessor :dilithium相同?也就是说,

代码语言:javascript
复制
class Enterprise
  attr :dilithium, true

等同于

代码语言:javascript
复制
class Enterprise
  attr_accessor :dilithium

attrattr_accessor这两个函数是更多还是更少冗余?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-20 01:45:29

一个不同之处在于attr_accessor和friends更加清晰,并且attr的可选布尔参数现在是deprecated。除此之外,attr没有文档这一事实,没有什么真正的区别。

票数 29
EN

Stack Overflow用户

发布于 2012-12-20 02:13:04

在Ruby1.8中,attr只能定义一个属性,并使用一个可选的true来创建setter。在1.9中,它的行为类似于attr_reader:它允许多个属性。正如@Linuxios所说,可选的布尔值已被弃用。

票数 7
EN

Stack Overflow用户

发布于 2016-07-02 16:39:19

如果你看一下Ruby2.3.0中的C代码,你会发现attrattr_reader实际上在做同样的事情(除了不推荐使用的代码路径)。它们本质上是等价的函数。

对我来说,主要的区别是:

attr更容易写,因为它更短。我也喜欢它在函数式/不可变编程上下文中的感觉(在这些上下文中,attr_writerattr_accessor是无关紧要的,因此使用attr_reader感觉冗长和多余)。

具有多个实例变量的attr使得文档很难记录,除非在非常特殊的情况下,例如

代码语言:javascript
复制
# The coordinates in WGS84.
attr :x, :y

# The location name.
attr :name

# The popularity of the location.
attr :popularity

如果:name:popularity在同一行attr :name, :popularity上,那么将很难独立地记录它们。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13958061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档