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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python11 079
  • Облачные технологии8 824
  • QA вакансии2 977
  • Android1 395
  • Инженер данных1 032
  • Продакт-менеджер351

Разработка

  • Backend вакансии1 342
  • iOS1 307
  • AI вакансии660
  • Fullstack вакансии524
  • Frontend вакансии465
  • Mobile вакансии28

По стеку

  • Go6 622
  • Java3 670
  • Kotlin1 199
  • Node.js1 190
  • Rust1 181
  • .NET780
  • PHP329
  • C++301
  • C#211

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

  • Kubernetes5 251
  • Linux-инфраструктура4 138
  • DevOps вакансии3 024
  • Terraform / IaC2 834
  • Мониторинг и Observability1 406
  • CI/CD917
  • SRE389
  • Кибербезопасность40

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

  • Аналитик данных586
  • Бизнес-аналитик487
  • Data Scientist458
  • Системный аналитик75

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

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

По регионам

  • Вакансии в США31 201
  • Вакансии в Европе11 507
  • Работа в России3 630
  • Вакансии в Канаде2 546

По формату

  • Удалённые вакансии47 761
  • Релокация в США31 201
  • Гибридная работа7 699
  • Офисная работа6 071

По уровню

  • Senior вакансии27 027
  • Middle вакансии12 284
  • Junior вакансии4 495

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

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

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

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

В чём разница между freeze и иммутабельными объектами в Ruby?

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

freeze делает объект неизменяемым в runtime — любая мутация бросает FrozenError. Заморозка поверхностная: вложенные объекты не замораживаются автоматически.

Как работает freeze

Object#freeze устанавливает флаг frozen на объекте. После этого любая попытка изменить объект бросает FrozenError (Ruby >= 2.5; ранее — RuntimeError).

str = 'hello'
str.freeze

str << ' world'    # FrozenError: can't modify frozen String: "hello"
str.upcase!        # FrozenError
str.replace('x')   # FrozenError

str.frozen?        # => true

# Но: создание НОВОГО объекта — OK:
upcased = str.upcase   # => "HELLO"  (новый объект, оригинал не изменён)

Заморозка поверхностная (shallow freeze)

config = { host: 'localhost', ports: [8080, 9090] }.freeze

config[:host] = 'example.com'   # FrozenError — нельзя менять hash
config[:ports] << 443            # OK! — массив внутри НЕ заморожен

puts config[:ports].inspect     # => [8080, 9090, 443]

Для глубокой заморозки нужно явно замораживать вложенные объекты или использовать gems типа deep_freeze:

def deep_freeze(obj)
  case obj
  when Hash  then obj.each_value { |v| deep_freeze(v) }.freeze
  when Array then obj.each { |v| deep_freeze(v) }.freeze
  else            obj.freeze
  end
end

config = deep_freeze({ host: 'localhost', ports: [8080, 9090] })
config[:ports] << 443  # FrozenError

Frozen string literals

# frozen_string_literal: true

STATUS = 'active'   # автоматически заморожена
STATUS << '!'       # FrozenError

# Если нужна изменяемая строка:
buffer = +''        # + создаёт незамороженную строку
buffer << 'hello'

Magic comment # frozen_string_literal: true замораживает все строковые литералы в файле. Это улучшает производительность (меньше аллокаций) и предотвращает случайную мутацию констант.

Зачем замораживать

  • Константы — ALLOWED_ROLES = %w[admin user guest].freeze. Без freeze массив-константу можно мутировать из любого места кода.
  • Hash-ключи — Ruby автоматически замораживает строки, используемые как ключи Hash, для экономии памяти.
  • Thread safety — замороженные объекты безопасно разделять между потоками без Mutex.
  • Выявление мутаций — в тестах можно заморозить входные данные, чтобы поймать неожиданные мутации в методе.

dup vs clone после freeze

frozen = 'immutable'.freeze

cloned = frozen.clone
duped  = frozen.dup

cloned.frozen?   # => true   (clone сохраняет frozen-статус)
duped.frozen?    # => false  (dup создаёт изменяемую копию)
duped << '!'     # => "immutable!"

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

  • Поверхностная заморозка вводит в заблуждение — hash.freeze не защищает вложенные массивы и объекты. Всегда замораживайте рекурсивно для конфигурационных объектов.
  • FrozenError в старых Ruby — в Ruby < 2.5 это RuntimeError с сообщением «can't modify frozen». Если поддерживаете старые версии, не ловите FrozenError по имени.
  • frozen_string_literal и мутирующий код — включение magic comment сломает код, который изменяет строковые литералы ('foo' << 'bar'). Исправьте мутации или используйте +'' / String.new.
  • Символы и Integer уже заморожены — :foo.frozen? и 1.frozen? всегда true. Вызывать на них freeze безопасно, но бессмысленно.
  • Сериализация замороженных объектов — Marshal корректно сериализует frozen-объекты; после десериализации объект не будет заморожен, если это не предусмотрено явно.
  • Производительность — заморозка не ускоряет сам объект; выигрыш в том, что frozen strings могут дедуплицироваться в памяти и не требуют защиты Mutex при многопоточном доступе.

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

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

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

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

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

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

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

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

Источники

  • https://docs.ruby-lang.org/en/master/Object.html
  • https://docs.ruby-lang.org/en/master/
←Предыдущий вопросПредставьте, сервис на Ruby стал медленнее или нестабильнее после релиза. Какие language/runtime-specific причины вы проверите?Следующий вопрос→Что такое Ruby Gems и как Bundler управляет зависимостями?

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

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