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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python7 042
  • Облачные технологии5 085
  • QA вакансии1 814
  • Android1 199
  • Инженер данных831
  • Продакт-менеджер339

Разработка

  • iOS1 135
  • Backend вакансии1 131
  • Fullstack вакансии475
  • AI вакансии458
  • Frontend вакансии404
  • Mobile вакансии27

По стеку

  • Go4 093
  • Java2 435
  • Kotlin990
  • Node.js827
  • Rust665
  • .NET525
  • PHP282
  • C++223
  • C#199

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

  • Kubernetes2 931
  • Linux-инфраструктура2 312
  • DevOps вакансии2 110
  • Terraform / IaC1 714
  • CI/CD872
  • Мониторинг и Observability825
  • SRE253
  • Кибербезопасность50

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

  • Аналитик данных497
  • Data Scientist463
  • Бизнес-аналитик374
  • Системный аналитик54

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

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

По регионам

  • Вакансии в США25 531
  • Вакансии в Европе9 792
  • Работа в России3 193
  • Вакансии в Канаде2 236

По формату

  • Удалённые вакансии43 578
  • Релокация в США25 531
  • Гибридная работа4 289
  • Офисная работа3 340

По уровню

  • Senior вакансии21 650
  • Middle вакансии12 211
  • Junior вакансии3 886

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

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise125 вакансий
  • Celonis28 вакансий
  • Infobip28 вакансий
  • Spotify24 вакансии
  • Adyen17 вакансий
  • Darktrace17 вакансий
  • Monzo13 вакансий

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

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

Что такое Struct и OpenStruct в Ruby и когда их стоит использовать?

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

Struct — быстрый генератор классов с фиксированными именованными атрибутами, поддерживающий ==, to_a, members. OpenStruct — динамический объект с произвольными атрибутами, медленнее и небезопаснее. В Ruby 3.2+ предпочитайте Data.define для иммутабельных значений.

Struct

Struct — встроенный генератор классов значений с заданным набором полей. Генерирует конструктор, геттеры/сеттеры, ==, to_a, to_h, members, each.

Point = Struct.new(:x, :y)
p1 = Point.new(1, 2)
p1.x       # => 1
p1.to_h    # => {x: 1, y: 2}
p1.to_a    # => [1, 2]

p2 = Point.new(1, 2)
p1 == p2   # => true  (сравнивает по значению)

# Keyword-аргументы (Ruby 2.5+)
Point = Struct.new(:x, :y, keyword_init: true)
p = Point.new(x: 10, y: 20)

Struct с методами

Person = Struct.new(:first_name, :last_name) do
  def full_name
    "#{first_name} #{last_name}"
  end

  def to_s
    full_name
  end
end

alice = Person.new("Alice", "Smith")
puts alice.full_name  # => "Alice Smith"

OpenStruct

OpenStruct из stdlib (require 'ostruct') — объект с динамически создаваемыми атрибутами. Атрибуты задаются при первом присваивании:

require 'ostruct'

user = OpenStruct.new(name: "Bob", age: 30)
user.name      # => "Bob"
user.email = "bob@example.com"  # новый атрибут
user.respond_to?(:email)  # => true

# Опасность: опечатка не вызывает ошибку
user.naem  # => nil (а не NoMethodError!)

Data.define (Ruby 3.2+)

Иммутабельный аналог Struct — все атрибуты только для чтения, объект автоматически заморожен:

Coordinate = Data.define(:lat, :lng)
c = Coordinate.new(lat: 55.75, lng: 37.62)
c.lat      # => 55.75
c.frozen?  # => true
# c.lat = 1  # => FrozenError

# with — создать копию с изменёнными полями
c2 = c.with(lat: 56.0)

Сравнение

  • Struct: фиксированные поля, изменяемый, быстрый, имеет == по значению. Для DTO, value objects, простых записей.
  • OpenStruct: динамические поля, медленный (использует method_missing + хэш), нет статической проверки. Избегайте в production-коде.
  • Data.define: фиксированные поля, иммутабельный, keyword-only, идеален для событий/команд/value objects.

Когда использовать

  • Struct — когда нужен быстрый класс-запись с небольшим числом полей и сравнением по значению (координаты, результаты запросов, тесты).
  • OpenStruct — прототипирование, тесты (фейковые объекты), скрипты. Никогда в hot path production-кода.
  • Data.define — иммутабельные value objects: деньги, координаты, доменные события.

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

  • OpenStruct работает через method_missing и динамически определяет методы — первый доступ к атрибуту значительно медленнее последующих.
  • Опечатка в имени атрибута OpenStruct возвращает nil без ошибки, что порождает трудноуловимые баги.
  • Struct без keyword_init: true принимает позиционные аргументы — лёгко перепутать порядок при большом числе полей.
  • Сравнение (==) у Struct сравнивает только поля, не учитывая подкласс: два разных Struct с одинаковыми полями не равны, но экземпляры одного Struct с одними значениями — равны.
  • Struct.new без присвоения константе создаёт анонимный класс — его нельзя десериализовать (Marshal) и сложно отлаживать.
  • В Ruby < 3.2 нет Data.define — используйте frozen Struct или Dry::Struct из гема.
  • Наследование от Struct работает, но добавляет неочевидные сложности с == и members.

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

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

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

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

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

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

Источники

  • https://docs.ruby-lang.org/en/master/Struct.html
  • https://docs.ruby-lang.org/en/master/
←Предыдущий вопросЧто такое `self` в Ruby и как меняется его значение в зависимости от контекста?Следующий вопрос→Как Ruby обрабатывает параллелизм? Что такое Threads, Fibers и GIL?

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

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 и чем они отличаются от классов?