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 @nameattr_writer :name # creates a method to write @nameattr_accessor :name # creates both read and write methodsend
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
definitialize(name)
@name = name
endend
This allows setting age but not reading it.
Ruby
class Person
attr_writer :age
endp = Person.newp.age = 30
This allows both reading and writing email.
Ruby
class Person
attr_accessor :email
endp = Person.newp.email = "a@b.com"putsp.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
definitialize(make, color, year)
@make = make
@color = color
@year = year
endend
car = Car.new("Toyota", "red", 2020)
puts car.make # read onlyputs 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
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