Bird
Raised Fist0
Rubyprogramming~20 mins

Attr_reader, attr_writer, attr_accessor in Ruby - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Ruby Attribute Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this Ruby code using attr_reader?

Consider this Ruby class with attr_reader. What will be printed?

Ruby
class Person
  attr_reader :name
  def initialize(name)
    @name = name
  end
end

p = Person.new("Alice")
puts p.name
p.name = "Bob"
A
Alice
Bob
BNoMethodError: undefined method `name' for #<Person:...>
C
Alice
NoMethodError: undefined method `name=' for #&lt;Person:...&gt;
D
nil
NoMethodError: undefined method `name=' for #&lt;Person:...&gt;
Attempts:
2 left
💡 Hint

Remember, attr_reader creates a getter method but no setter.

❓ Predict Output
intermediate
2:00remaining
What happens when using attr_writer only?

Look at this Ruby code using attr_writer. What will be the output or error?

Ruby
class Car
  attr_writer :color
  def initialize(color)
    @color = color
  end
end

car = Car.new("red")
puts car.color
car.color = "blue"
puts car.instance_variable_get(:@color)
ANoMethodError: undefined method `color' for #<Car:...>
BNoMethodError: undefined method `color=' for #<Car:...>
C
nil
blue
D
red
blue
Attempts:
2 left
💡 Hint

attr_writer creates a setter but no getter method.

❓ Predict Output
advanced
2:00remaining
What is the output when using attr_accessor?

Given this Ruby class with attr_accessor, what will be printed?

Ruby
class Book
  attr_accessor :title
  def initialize(title)
    @title = title
  end
end

book = Book.new("Ruby 101")
puts book.title
book.title = "Ruby 102"
puts book.title
A
Ruby 101
Ruby 102
B
Ruby 101
Ruby 101
CNoMethodError: undefined method `title=' for #<Book:...>
DNoMethodError: undefined method `title' for #<Book:...>
Attempts:
2 left
💡 Hint

attr_accessor creates both getter and setter methods.

🧠 Conceptual
advanced
1:30remaining
Which statement about attr_reader, attr_writer, and attr_accessor is true?

Choose the correct statement about these Ruby attribute methods.

A<code>attr_reader</code> creates both getter and setter methods.
B<code>attr_accessor</code> creates getter and setter methods.
C<code>attr_writer</code> creates only a getter method.
D<code>attr_accessor</code> creates only a setter method.
Attempts:
2 left
💡 Hint

Think about which methods allow reading and writing.

🔧 Debug
expert
2:30remaining
Why does this Ruby code raise NoMethodError when using attr_writer?

Look at this code snippet. Why does puts user.name raise NoMethodError?

Ruby
class User
  attr_writer :name
  def initialize(name)
    @name = name
  end
end

user = User.new("Eve")
puts user.name
ABecause <code>attr_writer</code> creates only a getter method, no setter method exists.
BBecause <code>attr_writer</code> creates both getter and setter methods, but the getter is private.
CBecause the instance variable <code>@name</code> is not initialized.
DBecause <code>attr_writer</code> only creates a setter method, no getter method exists.
Attempts:
2 left
💡 Hint

Check what methods attr_writer creates.

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