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

标签 ruby attributes attr-accessor

Ruby 有这种方便快捷的方式来共享实例变量,通过使用像这样的键

attr_accessor :var
attr_reader :var
attr_writer :var

如果我可以简单地使用 attr_accessor,为什么我会选择 attr_readerattr_writer?是否有类似性能的东西(我怀疑)?我想这是有原因的,否则他们不会制作这样的 key 。

最佳答案

您可以使用不同的访问器将您的意图传达给阅读您代码的人,并使编写无论其公共(public) 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_... 助手,并且必须自己编写访问器,您是否会编写比您的类需要的访问器更多的访问器?比如age只需要读取,你会不会也写一个方法让它可以写入?

关于ruby - 为什么要使用 Ruby 的 attr_accessor、attr_reader 和 attr_writer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5046831/

相关文章:

ruby - 简单的 Ruby 正则表达式问题

python - 更新多个属性python

ruby-on-rails - Ruby on Rails - 多参数分配和 attr_accessor 和 12_hour_time

ruby-on-rails - 当我将数据放在 :notes and :place, 上时,验证仍然失败

mysql - 使用 ruby​​ on Rails 中的联接获取列表中唯一的项目

ruby - 当我尝试将 rack-flash 添加到我的 sinatra 应用程序时,它停止工作

python - 在 Python 中检查属性是否存在且为真

ruby-on-rails-4 - Rails4 : How to trigger the callback for attr_accessor while using accepts_nested_attributes_for

Ruby,捕获字符串的结尾部分

xml - 强制xslt生成 "xml"域名