Using attr_reader, attr_writer, and attr_accessor in Ruby
📖 Scenario: Imagine you are creating a simple program to manage a book's information in a library system. You want to control how the book's title and author can be accessed and changed.
🎯 Goal: Build a Ruby class Book that uses attr_reader, attr_writer, and attr_accessor to manage the book's title and author attributes properly.
📋 What You'll Learn
Create a class called Book with two instance variables: @title and @author.
Use attr_reader to allow reading the title only.
Use attr_writer to allow writing (changing) the author only.
Use attr_accessor to allow both reading and writing for a new attribute publisher.
Create an instance of Book with initial values for title, author, and publisher.
Print the title, change the author, change the publisher, and print all updated values.
💡 Why This Matters
🌍 Real World
Using <code>attr_reader</code>, <code>attr_writer</code>, and <code>attr_accessor</code> helps control how data inside objects can be accessed or changed, which is important in real software to keep data safe and consistent.
💼 Career
Many Ruby jobs require understanding how to use these accessors to write clean, maintainable code that protects object data and follows good design principles.
Progress0 / 4 steps
1
Create the Book class with instance variables
Create a class called Book with an initialize method that sets @title to "Ruby Basics" and @author to "Jane Doe".
Ruby
Hint
Use class Book and define initialize with @title and @author set to the exact strings.
2
Add attr_reader and attr_writer for title and author
Add attr_reader :title to allow reading the title and attr_writer :author to allow changing the author.
Ruby
Hint
Use attr_reader :title and attr_writer :author inside the class but outside any method.
3
Add attr_accessor for publisher and initialize it
Add attr_accessor :publisher to the class and update the initialize method to set @publisher to "Tech Books Publishing".
Ruby
Hint
Add attr_accessor :publisher and set @publisher in initialize.
4
Create a Book instance and use the accessors
Create a variable book as a new Book instance. Print the title using book.title. Change the author to "John Smith" using book.author=. Change the publisher to "New Publisher" using book.publisher=. Finally, print the updated author and publisher using puts.
Ruby
Hint
Create the book object, print title, update author and publisher, then print updated values.
Practice
(1/5)
1. What does attr_reader do in a Ruby class?
easy
A. Creates a method to read an attribute value
B. Creates a method to write an attribute value
C. Creates methods to both read and write an attribute
D. Deletes an attribute from the class
Solution
Step 1: Understand attr_reader purpose
attr_reader defines a getter method for an instance variable, allowing you to read its value.
Step 2: Compare with other attr methods
attr_writer creates a setter (write) method, and attr_accessor creates both getter and setter methods.
Final Answer:
Creates a method to read an attribute value -> Option A
Quick Check:
attr_reader = read method [OK]
Hint: attr_reader = read only method [OK]
Common Mistakes:
Confusing attr_reader with attr_writer
Thinking attr_reader allows writing values
Mixing attr_accessor with attr_reader
2. Which of the following is the correct syntax to create both getter and setter methods for @name in Ruby?
easy
A. attr_writer :name
B. attr_accessor :name
C. attr_reader :name
D. attr_both :name
Solution
Step 1: Recall attr_accessor usage
attr_accessor creates both getter and setter methods for the given symbol.
Step 2: Check other options
attr_reader only creates getter, attr_writer only setter, and attr_both is invalid syntax.
Final Answer:
attr_accessor :name -> Option B
Quick Check:
attr_accessor = read + write [OK]
Hint: Use attr_accessor for read and write [OK]
Common Mistakes:
Using attr_reader when write is needed
Using invalid method names like attr_both
Confusing attr_writer with attr_accessor
3. What will be the output of this Ruby code?
class Person
attr_writer :age
def initialize(age)
@age = age
end
def show_age
@age
end
end
p = Person.new(30)
puts p.show_age
p.age = 40
puts p.show_age
medium
A. 30\n40
B. 30\n30
C. Error: undefined method `age='
D. Error: undefined method `show_age'
Solution
Step 1: Understand attr_writer effect
attr_writer :age creates a setter method age=, but no getter method is created.
Step 2: Analyze method calls
p.show_age returns @age which is 30 initially. Then p.age = 40 sets @age to 40. But p.show_age returns @age which is now 40.
Step 3: Check output
Actually, p.show_age is called twice, before and after setting age. So outputs are 30 then 40.
Hint: attr_writer only sets; custom getter needed [OK]
Common Mistakes:
Assuming attr_writer creates getter method
Expecting error on p.age= assignment
Confusing show_age method with attr_reader
4. Identify the error in this Ruby class:
class Car
attr_reader :model
def initialize(model)
@model = model
end
def model=(value)
@model = value
end
end
car = Car.new('Sedan')
car.model = 'SUV'
puts car.model
medium
A. Error: attr_reader conflicts with manual setter method
B. Error: undefined method 'model='
C. Error: attr_reader does not create setter method
D. No error, code runs and prints 'SUV'
Solution
Step 1: Check attr_reader and setter method
attr_reader :model creates a getter method. The setter method model= is manually defined.
Step 2: Analyze method calls
car.model = 'SUV' calls the manual setter, updating @model. puts car.model calls the getter from attr_reader, printing 'SUV'.
Final Answer:
No error, code runs and prints 'SUV' -> Option D
Quick Check:
attr_reader + manual setter works [OK]
Hint: attr_reader + manual setter is valid [OK]
Common Mistakes:
Assuming attr_reader creates setter method
Thinking attr_reader conflicts with manual setter
Expecting error on model= assignment
5. You want a Ruby class Book where the title can be read but not changed, and the author can be both read and changed. Which attribute methods should you use?
hard
A. attr_writer :title
attr_writer :author
B. attr_writer :title
attr_reader :author
C. attr_reader :title
attr_accessor :author
D. attr_accessor :title
attr_writer :author
Solution
Step 1: Determine access for title
Title should be readable but not writable, so use attr_reader :title.
Step 2: Determine access for author
Author should be readable and writable, so use attr_accessor :author.
Final Answer:
attr_reader :title
attr_accessor :author -> Option C