小编典典

为什么要使用 Ruby 的 attr_accessor、attr_reader 和 attr_writer?

all

Ruby 有这种方便快捷的方式来共享实例变量,方法是使用类似的键

attr_accessor :var
attr_reader :var
attr_writer :var

我为什么要选择attr_reader或者attr_writer我可以简单地使用attr_accessor?有没有类似性能的东西(我怀疑)?我想这是有原因的,否则他们不会制造这样的钥匙。


阅读 91

收藏
2022-03-10

共1个答案

小编典典

您可以使用不同的访问器将您的意图传达给阅读您的代码的人,并使编写无论如何调用公共 API 都能正常工作的类变得更容易。

class Person
  attr_accessor :age
  ...
end

在这里,我可以看到我可以读和写的年龄。

class Person
  attr_reader :age
  ...
end

在这里,我可以看到我可能只阅读年龄。想象一下,它是由这个类的构造函数设置的,之后保持不变。如果有一个年龄的修改器(编写器),并且假设年龄一旦设置就不会改变,那么编写该类时,调用该修改器的代码可能会导致错误。

但是幕后发生了什么?

如果你写:

attr_writer :age

这被翻译成:

def age=(value)
  @age = value
end

如果你写:

attr_reader :age

这被翻译成:

def age
  @age
end

如果你写:

attr_accessor :age

这被翻译成:

def age=(value)
  @age = value
end

def age
  @age
end

知道了这一点,这里有另一种思考方式:如果你没有 attr_…
帮助器,并且必须自己编写访问器,你会编写比你的类需要更多的访问器吗?例如,如果只需要读取年龄,您是否还会编写一个允许写入的方法?

2022-03-10