Bird
Raised Fist0
Rubyprogramming~30 mins

Attr_reader, attr_writer, attr_accessor in Ruby - Mini Project: Build & Apply

Choose your learning style10 modes available
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

  1. Step 1: Understand attr_reader purpose

    attr_reader defines a getter method for an instance variable, allowing you to read its value.
  2. Step 2: Compare with other attr methods

    attr_writer creates a setter (write) method, and attr_accessor creates both getter and setter methods.
  3. Final Answer:

    Creates a method to read an attribute value -> Option A
  4. 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

  1. Step 1: Recall attr_accessor usage

    attr_accessor creates both getter and setter methods for the given symbol.
  2. Step 2: Check other options

    attr_reader only creates getter, attr_writer only setter, and attr_both is invalid syntax.
  3. Final Answer:

    attr_accessor :name -> Option B
  4. 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

  1. Step 1: Understand attr_writer effect

    attr_writer :age creates a setter method age=, but no getter method is created.
  2. 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.
  3. Step 3: Check output

    Actually, p.show_age is called twice, before and after setting age. So outputs are 30 then 40.
  4. Final Answer:

    30\n40 -> Option A
  5. Quick Check:

    attr_writer allows setting, show_age reads @age [OK]
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

  1. Step 1: Check attr_reader and setter method

    attr_reader :model creates a getter method. The setter method model= is manually defined.
  2. 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'.
  3. Final Answer:

    No error, code runs and prints 'SUV' -> Option D
  4. 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

  1. Step 1: Determine access for title

    Title should be readable but not writable, so use attr_reader :title.
  2. Step 2: Determine access for author

    Author should be readable and writable, so use attr_accessor :author.
  3. Final Answer:

    attr_reader :title attr_accessor :author -> Option C
  4. Quick Check:

    Read-only + read-write = attr_reader + attr_accessor [OK]
Hint: Use attr_reader for read-only, attr_accessor for read-write [OK]
Common Mistakes:
  • Using attr_writer for read-only attribute
  • Using attr_accessor for read-only attribute
  • Mixing up read and write access
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard