Bird
Raised Fist0
Rubyprogramming~5 mins

Attr_reader, attr_writer, attr_accessor in Ruby

Choose your learning style10 modes available
Introduction

These keywords help you easily create methods to get or set object data without writing extra code.

When you want to read a value from an object safely.
When you want to change a value inside an object.
When you want both reading and writing access to an object's data.
When you want to keep your code short and clean.
When you want to control how object data is accessed or changed.
Syntax
Ruby
class ClassName
  attr_reader :name  # creates a method to read @name
  attr_writer :name  # creates a method to write @name
  attr_accessor :name # creates both read and write methods
end

Use attr_reader for read-only access.

Use attr_writer for write-only access.

Examples
This creates a read-only name method.
Ruby
class Person
  attr_reader :name
  def initialize(name)
    @name = name
  end
end
This allows setting age but not reading it.
Ruby
class Person
  attr_writer :age
end

p = Person.new
p.age = 30
This allows both reading and writing email.
Ruby
class Person
  attr_accessor :email
end

p = Person.new
p.email = "a@b.com"
puts p.email
Sample Program

This program shows how each keyword works: make can only be read, color can be read and changed, and year can only be changed.

Ruby
class Car
  attr_accessor :color
  attr_reader :make
  attr_writer :year

  def initialize(make, color, year)
    @make = make
    @color = color
    @year = year
  end
end

car = Car.new("Toyota", "red", 2020)
puts car.make      # read only
puts car.color     # read and write
car.color = "blue"
puts car.color
car.year = 2021   # write only
# puts car.year    # would cause error because no reader
OutputSuccess
Important Notes

If you try to read a write-only attribute, Ruby will give an error.

Using these keywords keeps your code shorter and easier to read.

You can use them with many attributes at once, like attr_accessor :a, :b, :c.

Summary

attr_reader creates a method to read an attribute.

attr_writer creates a method to write an attribute.

attr_accessor creates both read and write methods.

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