Опишите разницу между локальными, переменными экземпляра и класса.ruby-8

1. Локальные переменные

Область видимости: Только в текущей области (метод, блок, класс)

def calculate
  result = 42  # Локальная переменная
  puts result
end

calculate     # => 42
puts result   # NameError: undefined local variable

Особенности:

  • Начинаются с маленькой буквы или _
  • Видны только в текущем контексте
  • Удаляются после выхода из области видимости

2. Переменные экземпляра

Область видимости: Доступны во всех методах экземпляра класса

class User
  def initialize(name)
    @name = name  # Переменная экземпляра
  end

  def greet
    "Hello, #{@name}!"  # Доступна в другом методе
  end
end

user = User.new("Alice")
user.greet  # => "Hello, Alice!"

Особенности:

  • Начинаются с @
  • Разные значения у разных экземпляров
  • По умолчанию nil (не вызывают NameError)
  • Используются для хранения состояния объекта

3. Переменные класса

Область видимости: Общие для всех экземпляров класса и наследников

class Counter
  @@count = 0  # Переменная класса

  def initialize
    @@count += 1
  end

  def self.total
    @@count
  end
end

Counter.new
Counter.new
Counter.total  # => 2

Особенности:

  • Начинаются с @@
  • Общее состояние для всех экземпляров
  • Наследуются (но это может быть проблемой!)
  • Используются редко (чаще применяют class instance variables)

Сравнительная таблица

ХарактеристикаЛокальные@ivar@@cvar
Префикснет@@@
ВидимостьТекущий контекстЭкземплярВсе экземпляры
Наследование-НетДа
Доступ из классаНетНетДа
ИнициализацияОбязательнаАвтоматически nilОбязательна

Альтернатива: переменные экземпляра класса

Более безопасная альтернатива @@cvar:

class Config
  @settings = {}  # Переменная экземпляра класса

  class << self
    attr_accessor :settings
  end
end

Config.settings[:timeout] = 10

Резюмируем

  1. Локальные переменные:

    • Видны только в текущем блоке/методе
    • Лучший выбор для временных вычислений
  2. Переменные экземпляра (@):

    • Хранят состояние объекта
    • Доступны во всех методах экземпляра
    • Основной инструмент ООП в Ruby
  3. Переменные класса (@@):

    • Общие для всех экземпляров
    • Используйте осторожно (лучше class instance variables)
    • Могут вызывать неожиданные сайд-эффекты

Правильный выбор типа переменной делает код чище и предотвращает баги.