Instance Variables in Ruby
Per‑object state starting with @; default to nil until assigned.
Basics and lifetime
Instance variables live on each object; they’re accessible across instance methods.
class Account
def initialize
@balance = 0
end
def deposit(amount)
@balance += amount
end
def balance
@balance
end
end
Accessors
Use attr_reader, attr_writer, or attr_accessor to expose controlled access.
class User
attr_reader :name
attr_writer :nickname
# or attr_accessor :name, :nickname
def initialize(name)
@name = name
end
end
Validation and custom writers
Define explicit setters/getters when you need invariants or side effects.
class Temperature
def celsius=(value)
raise ArgumentError unless value.is_a?(Numeric)
@celsius = value
end
def celsius
@celsius
end
end
Memoization pattern
Compute once and cache in an instance variable; use ||= when falsy values are not expected (or check explicitly).
class Report
def data
@data ||= expensive_query
end
private
def expensive_query; [1,2,3] end
end
Introspection and reflection
List or read instance variables dynamically (useful for serialization/debugging).
obj.instance_variables # => [:@name, :@balance]
obj.instance_variable_get(:@name)
obj.instance_variable_set(:@name, "New")
Summary
@ivarbelongs to each object; starts asniluntil assigned- Use
attr_*for simple access; custom methods for validation or side effects - Memoize with
@ivar ||= ...(be careful iffalse/nilare valid results)