Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·60 871вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 951
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python9 224
  • Облачные технологии6 770
  • QA вакансии2 176
  • Android1 322
  • Инженер данных940
  • Продакт-менеджер435

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C++273
  • C#210

DevOps и инфраструктура

  • Kubernetes4 025
  • Linux-инфраструктура3 060
  • DevOps вакансии2 713
  • Terraform / IaC2 214
  • Мониторинг и Observability1 106
  • CI/CD919
  • SRE341
  • Кибербезопасность90

Аналитика и данные

  • Аналитик данных555
  • Data Scientist513
  • Бизнес-аналитик431
  • Системный аналитик65

Другие направления

  • Проджект-менеджер160
  • UI/UX дизайн77
  • Ручное тестирование14

По регионам

  • Вакансии в США29 375
  • Вакансии в Европе11 048
  • Работа в России3 627
  • Вакансии в Канаде2 514

По формату

  • Удалённые вакансии48 640
  • Релокация в США29 375
  • Гибридная работа5 790
  • Офисная работа4 553

По уровню

  • Senior вакансии25 029
  • Middle вакансии13 245
  • Junior вакансии4 377

Сейчас нанимают

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме RubyВсе вопросы
RubyMiddleТеория

Что такое attr_accessor, attr_reader и attr_writer в Ruby?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

attr_accessor создаёт и getter, и setter; attr_reader — только getter; attr_writer — только setter. Все три генерируют методы через Module#define_method во время интерпретации класса.

Пример

class User
  attr_accessor :name, :email   # getter + setter для обоих
  attr_reader   :id             # только getter — id менять нельзя снаружи
  attr_writer   :password_hash  # только setter — читать не должны

  def initialize(id, name, email)
    @id    = id
    @name  = name
    @email = email
  end
end

user = User.new(1, 'Alice', 'alice@example.com')
puts user.name          # => "Alice"  (getter)
user.name = 'Bob'       # setter
puts user.id            # => 1
# user.id = 2           # NoMethodError: undefined method `id='
user.password_hash = 'bcrypt...'  # setter работает
# user.password_hash    # NoMethodError: undefined method `password_hash'

Что такое attr_accessor, attr_reader и attr_writer

В Ruby instance-переменные (@var) по умолчанию недоступны снаружи объекта. Чтобы открыть доступ, нужно вручную написать методы-getter и setter — или воспользоваться макросами Module#attr_*, которые генерируют эти методы автоматически.

  • attr_reader :name — создаёт метод def name; @name; end
  • attr_writer :name — создаёт метод def name=(val); @name = val; end
  • attr_accessor :name — создаёт оба метода сразу

Вызов этих макросов происходит на этапе загрузки класса (class body execution), а не в runtime каждого объекта. Под капотом Ruby вызывает define_method на модуле класса.

Ограничение доступа как проектное решение

Выбор между тремя макросами — это выражение инварианта объекта в коде:

  • Если поле всегда устанавливается в initialize и никогда не должно меняться снаружи — только attr_reader.
  • Если поле должно быть доступно для чтения внешним кодом и изменения — attr_accessor.
  • attr_writer без attr_reader встречается редко; типичный случай — injection зависимости, где класс принимает настройку, но не возвращает её наружу (например, пароль, токен).

Переопределение сгенерированных методов

class Product
  attr_reader :price

  def price=(value)
    raise ArgumentError, 'Price must be positive' unless value.positive?
    @price = value
  end
end

Можно сначала объявить attr_writer, а затем переопределить setter с валидацией. Порядок объявления не важен — Ruby перезапишет метод последним определением.

protected и private для attr_*

class BankAccount
  attr_reader :balance

  private

  attr_writer :balance  # setter приватный — снаружи не вызвать
end

Размещение attr_writer после private делает setter недоступным вне класса. Это распространённый паттерн для защиты внутреннего состояния.

Подводные камни

  • Избыточный attr_accessor: открывать setter для всех полей по умолчанию — нарушение инкапсуляции. Предпочитайте attr_reader и явно разрешайте запись только там, где это нужно.
  • Символ vs строка: attr_reader :name работает, attr_reader "name" — тоже, но принято передавать символы.
  • Переопределение в subclass: если в подклассе объявить attr_writer :field, а суперкласс уже имеет attr_reader :field, доступ будет работать — но убедитесь, что это ожидаемое поведение.
  • Конфликт с методами модулей: если включаемый модуль определяет метод с тем же именем, а класс после этого вызывает attr_accessor, сгенерированный метод перекроет метод модуля.
  • Rspec и attr_reader: в тестах часто нужен доступ к приватному состоянию. Лучше тестировать через публичный интерфейс, а не обходить ограничения через send.
  • Freeze и setter: вызов setter на замороженном объекте бросает FrozenError. Если объект может быть заморожен (например, константы), убедитесь, что setters не вызываются после freeze.
  • Thread safety: attr_accessor не является атомарной операцией в MRI при конкурентных записях. Для разделяемого состояния используйте Mutex или Concurrent::AtomicReference из concurrent-ruby.

Типичные ошибки

  • Сводить attr accessors к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: объектная динамическая модель Ruby, где почти всё является объектом, а методы ищутся через ancestor chain.
  • Не отделять validation, authorization, transaction boundary и business logic.

Что проверяет интервьюер

  • Объясняет attr accessors через конкретную точку lifecycle в Ruby.
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.

Как вы знаете этот вопрос?

Проверить себя по теме Ruby →

Источники

  • https://docs.ruby-lang.org/en/master/Module.html
  • https://docs.ruby-lang.org/en/master/
←Предыдущий вопросЧто такое Ruby Gems и как Bundler управляет зависимостями?Следующий вопрос→В чём разница между `clone` и `dup` в Ruby?

Связанные темы

RubyBackend-Engineeringruby-ecosystem

Вакансии с этим навыком

Ruby вакансии
  • Cloud Engineer
  • DevOps Engineer - Recommendation Department, AI & Data Division (AIDD)
  • Security Detection & Automation Engineer - Product Security Section, Cyber Security Defense Department (CSDD)
  • Sales Engineer
  • Backend Engineer, Knowledge Graph

Частые вопросы на собеседовании

  • В чём разница между symbols и strings в Ruby и когда использовать каждый?
  • В чём разница между nil, false и другими ложными значениями (falsy values) в Ruby?
  • В чём разница между proc и lambda с точки зрения поведения return и арности (arity)?
  • Что такое модули Ruby и чем они отличаются от классов?