GGistDev

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

  • @ivar belongs to each object; starts as nil until assigned
  • Use attr_* for simple access; custom methods for validation or side effects
  • Memoize with @ivar ||= ... (be careful if false/nil are valid results)