self
в Ruby — это специальная переменная, которая всегда ссылается на текущий объект в контексте выполнения. Это ключевая концепция объектно-ориентированного программирования в Ruby.
class User
def name
self # Возвращает текущий экземпляр
end
end
user = User.new
user.name == user # => true
class Logger
def self.instance
self # Возвращает класс (Logger)
end
end
Logger.instance == Logger # => true
class Calculator
# self здесь - это Calculator (класс)
def self.square(x)
x * x
end
end
class Account
attr_accessor :balance
def transfer(other_account, amount)
self.balance -= amount # self явно
other_account.balance += amount
end
end
class Example
def var
@var = 10
var = 20 # Создается локальная переменная
self.var # Ошибка: метод var
self.var = 30 # Вызовет метод var=
end
end
class Configuration
def self.setup
# self здесь - это класс Configuration
end
end
class Test
def test_self
[1,2,3].map { |x| self } # self остается тем же
end
end
obj = Object.new
class << obj
def show_self
self # Возвращает obj
end
end
module Tools
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def tool
self # Класс, включающий модуль
end
end
end
С помощью instance_eval
и instance_exec
:
class Demo; end
Demo.new.instance_eval { self } # => #<Demo:0x000...>
self.class # Класс объекта
self.methods # Доступные методы
self.to_s # Строковое представление
self
— это указатель на текущий объект выполненияПравильное понимание self
критически важно для профессиональной работы с Ruby.