Какова роль 'self'?ruby-10

Основное понятие

self в Ruby — это специальная переменная, которая всегда ссылается на текущий объект в контексте выполнения. Это ключевая концепция объектно-ориентированного программирования в Ruby.

Контексты использования self

1. В методах экземпляра

class User
  def name
    self  # Возвращает текущий экземпляр
  end
end

user = User.new
user.name == user  # => true

2. В методах класса

class Logger
  def self.instance
    self  # Возвращает класс (Logger)
  end
end

Logger.instance == Logger  # => true

3. При определении методов

class Calculator
  # self здесь - это Calculator (класс)
  def self.square(x)
    x * x
  end
end

Ключевые роли self

1. Явное указание получателя

class Account
  attr_accessor :balance

  def transfer(other_account, amount)
    self.balance -= amount       # self явно
    other_account.balance += amount
  end
end

2. Разрешение неоднозначности

class Example
  def var
    @var = 10
    var = 20     # Создается локальная переменная

    self.var     # Ошибка: метод var
    self.var = 30 # Вызовет метод var=
  end
end

3. Определение методов класса

class Configuration
  def self.setup
    # self здесь - это класс Configuration
  end
end

Особые случаи

1. В блоке кода

class Test
  def test_self
    [1,2,3].map { |x| self }  # self остается тем же
  end
end

2. В singleton-классах

obj = Object.new
class << obj
  def show_self
    self  # Возвращает obj
  end
end

3. В модулях

module Tools
  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def tool
      self  # Класс, включающий модуль
    end
  end
end

Динамическое изменение self

С помощью instance_eval и instance_exec:

class Demo; end
Demo.new.instance_eval { self }  # => #<Demo:0x000...>

Методы для работы с self

self.class    # Класс объекта
self.methods  # Доступные методы
self.to_s     # Строковое представление

Резюмируем

  1. self — это указатель на текущий объект выполнения
  2. Основные контексты:
    • В методах экземпляра → экземпляр класса
    • В методах класса → сам класс
    • В модулях → модуль или включающий класс
  3. Ключевые применения:
    • Явный вызов методов
    • Определение методов класса
    • Разрешение неоднозначности
  4. Особенности:
    • Меняется в зависимости от контекста
    • Можно изменять динамически (eval)
    • Всегда доступен в любом месте кода

Правильное понимание self критически важно для профессиональной работы с Ruby.