attr_reader 是一个“getter 方法”。换句话说,它允许我们声明数据属性将是公开可读的。
当您在类的实例上保存数据属性时,默认情况下无法从类外部查看该数据。通过设置attr_reader,我们可以从任何地方访问该属性。
这是一个使用您问题中的“名称”字段的示例。
# without "attr_reader"
class DocumentIdentifier
def initialize(folder, name)
@folder = folder
@name = name
end
end
first_example = DocumentIdentifier.new(nil, 'test')
first_example.name
这会报错:
Traceback (most recent call last):
4: from /Users/ibell/.rvm/rubies/ruby-2.6.5/bin/irb:23:in `<main>'
3: from /Users/ibell/.rvm/rubies/ruby-2.6.5/bin/irb:23:in `load'
2: from /Users/ibell/.rvm/rubies/ruby-2.6.5/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
1: from (irb):9
NoMethodError (undefined method `name' for #<DocumentIdentifier:0x00007fe0160956e8 @folder=2, @name="l">)
现在,如果您添加 attr_accessor,同样的代码也可以使用。
class DocumentIdentifier
attr_reader :name
def initialize(folder, name)
@folder = folder
@name = name
end
end
second_example = DocumentIdentifier.new(nil, 'test')
second_example.name
这会给你返回字符串“test”。
正如我们需要读取数据一样,我们可能也想写入数据。 attr_writer 与attr_reader 的工作方式类似,但它允许我们“设置”数据。
class DocumentIdentifier
attr_writer :name
def initialize(folder, name)
@folder = folder
@name = name
end
end
second_example = DocumentIdentifier.new(nil, 'test')
second_example.name = 'we can change this text'
second_example.name
这会给你回:'we can change this text'
最后,attr_accessor 是当您希望 attr_reader 和 attr_writer 具有相同属性时的快捷方式。