在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
这两个函数是冗余还是冗余?
4条答案
按热度按时间azpvetkf1#
attr_accessor
和friends的一个不同之处是更加清晰,并且attr
的可选布尔参数现在被弃用,除此之外,以及attr
没有文档这一事实,没有什么真实的的区别。dgiusagp2#
在Ruby 1.8中,
attr
只能定义一个属性,可选的true
可以创建一个setter。在Ruby 1.9中,它的行为类似于attr_reader
:它允许多个属性。正如@Linuxios所说,可选的布尔值已被弃用。cpjpxq1n3#
如果你看一下Ruby 2.3.0中的C代码,你会发现
attr
和attr_reader
实际上做的是相同的事情(除了被弃用的代码路径),它们本质上是等价的函数。对我来说,主要的区别是:
由于
attr
比较短,所以写起来比较容易,我也喜欢它在函数式/不可变编程上下文中的感觉(在这些上下文中,attr_writer
和attr_accessor
是不相关的,因此使用attr_reader
感觉冗长和多余)。attr
带有多个示例变量,这使得很难记录,除非在非常特殊的情况下,例如如果
:name
和:popularity
在同一行attr :name, :popularity
上,则很难单独记录它们。除此之外,它归结为个人喜好。在实践中没有性能差异或任何其他差异。
iih3973s4#
attr
和attr_accessor
是Ruby中用于定义类中示例变量的方法。attr
创建一个简单的getter方法,该方法返回与作为参数传递的符号同名的示例变量的值。例如:attr_accessor
为与作为参数传递的符号同名的示例变量创建***getter***和***setter***方法。例如:在上面的例子中,
my_object.my_variable
是可以读写的,attr_accessor
方法创建了getter和setter方法,允许读写示例变量的值。