Область видимости: Только в текущей области (метод, блок, класс)
def calculate
result = 42 # Локальная переменная
puts result
end
calculate # => 42
puts result # NameError: undefined local variable
Особенности:
_
Область видимости: Доступны во всех методах экземпляра класса
class User
def initialize(name)
@name = name # Переменная экземпляра
end
def greet
"Hello, #{@name}!" # Доступна в другом методе
end
end
user = User.new("Alice")
user.greet # => "Hello, Alice!"
Особенности:
@
nil
(не вызывают NameError)Область видимости: Общие для всех экземпляров класса и наследников
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
Локальные переменные:
Переменные экземпляра (@
):
Переменные класса (@@
):
class instance variables
)Правильный выбор типа переменной делает код чище и предотвращает баги.