ruby 属性与属性访问器

yftpprvb  于 2023-02-03  发布在  Ruby
关注(0)|答案(4)|浏览(169)

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

class Enterprise
  attr :dilithium, true

等同于

class Enterprise
  attr_accessor :dilithium

attrattr_accessor这两个函数是冗余还是冗余?

azpvetkf

azpvetkf1#

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

dgiusagp

dgiusagp2#

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

cpjpxq1n

cpjpxq1n3#

如果你看一下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上,则很难单独记录它们。
除此之外,它归结为个人喜好。在实践中没有性能差异或任何其他差异。

iih3973s

iih3973s4#

attrattr_accessor是Ruby中用于定义类中示例变量的方法。
attr创建一个简单的getter方法,该方法返回与作为参数传递的符号同名的示例变量的值。例如:

class MyClass
  attr :my_variable

  def initialize
    @my_variable = "Hello World"
  end
end

my_object = MyClass.new
puts my_object.my_variable # outputs "Hello World"

attr_accessor为与作为参数传递的符号同名的示例变量创建***getter***和***setter***方法。例如:

class MyClass
  attr_accessor :my_variable

  def initialize
    @my_variable = "Hello World"
  end
end

my_object = MyClass.new
puts my_object.my_variable # outputs "Hello World"
my_object.my_variable = "Goodbye World"
puts my_object.my_variable # outputs "Goodbye World"

在上面的例子中,my_object.my_variable是可以读写的,attr_accessor方法创建了getter和setter方法,允许读写示例变量的值。

相关问题