Ruby Easy technical 0 views 1 min read

What do attr_reader, attr_writer and attr_accessor do?

Peer-reviewed by HireXTech Technical Panel Updated for 2025/2026 hiring Editorial standards
Practise this track
Interviewer Expectations for this Question
01
Core Competency

Assesses fundamental understanding of Ruby conventions, runtime behavior, and memory/performance considerations.

02
Evaluation Criteria

Hiring managers look for precision, avoidance of ambiguous jargon, and ability to explain trade-offs under real production conditions.

Comprehensive Model Answer Verified Solution

Ruby encapsulates instance variables such as @name, which are private by default. attr_reader, attr_writer and attr_accessor are class macros that define getter and setter methods.

class User
  attr_reader   :id       # def id; @id; end
  attr_writer   :email    # def email=(value); @email = value; end
  attr_accessor :name     # both getter and setter
end

u = User.new
u.name = "Ada"
puts u.name

attr_accessor :a, :b defines several at once. These are ordinary methods, so they can be overridden or made private with private :name=, restricting external writes.

attr_* accepts an optional boolean second argument to skip instance-variable initialisation warnings. Using accessors internally rather than @name directly lets subclasses override behaviour and keeps the interface consistent. For deeply immutable objects use attr_reader plus freeze.

Candidate Response Strategy & Interview Tips

  1. Start with a concise one-sentence summary: Deliver a direct, confident answer first before expanding into nuances.
  2. Demonstrate real-world trade-offs: Discuss where this approach excels and when you would avoid it in production systems.
  3. Discuss complexity & edge cases: Proactively explain time/space complexity or boundary conditions (null values, scale limits).
  4. Prepare for interviewer follow-ups: Technical hiring panels frequently probe deeper into concurrency, backward compatibility, or alternative libraries.
Related Topics & Skills
Spotted an error or have an alternative solution?