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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 146
  • Облачные технологии14 070
  • QA вакансии3 446
  • Backend вакансии2 089
  • Инженер данных1 792
  • Продакт-менеджер1 233

Разработка

  • Android1 863
  • iOS1 701
  • Fullstack вакансии976
  • AI вакансии944
  • Frontend вакансии738
  • Mobile вакансии44

По стеку

  • Go8 699
  • Java6 545
  • Node.js2 025
  • .NET1 723
  • Kotlin1 613
  • Rust1 462
  • C#710
  • PHP684
  • C++574

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

  • Kubernetes7 765
  • DevOps вакансии6 051
  • Linux-инфраструктура5 492
  • Terraform / IaC4 271
  • CI/CD3 242
  • Мониторинг и Observability1 790
  • SRE565
  • Кибербезопасность451

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

  • Data Scientist1 124
  • Бизнес-аналитик916
  • Аналитик данных839
  • Системный аналитик151

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

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

По регионам

  • Вакансии в США43 094
  • Вакансии в Европе23 429
  • Вакансии в Канаде4 376
  • Работа в России3 902

По формату

  • Удалённые вакансии72 758
  • Релокация в США43 100
  • Гибридная работа12 402
  • Офисная работа7 096

По уровню

  • Senior вакансии42 000
  • Middle вакансии20 393
  • Junior вакансии6 602

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 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 вакансии
  • Developer Support Engineer
  • Senior Software Engineer (Ruby/Rails), MVR
  • Principal Endpoint Platform Engineer
  • Senior Platform Engineer (Infrastructure)
  • Senior Machine Learning Engineer

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

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