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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 142
  • Облачные технологии14 065
  • QA вакансии3 445
  • Backend вакансии2 112
  • Инженер данных1 804
  • Продакт-менеджер1 258

Разработка

  • Android1 854
  • iOS1 693
  • Fullstack вакансии989
  • AI вакансии951
  • Frontend вакансии749
  • Mobile вакансии44

По стеку

  • Go8 688
  • Java6 528
  • Node.js2 023
  • .NET1 722
  • Kotlin1 595
  • Rust1 462
  • C#710
  • PHP683
  • C++573

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

  • Kubernetes7 763
  • DevOps вакансии6 055
  • Linux-инфраструктура5 489
  • Terraform / IaC4 268
  • CI/CD3 243
  • Мониторинг и Observability1 789
  • SRE570
  • Кибербезопасность459

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

  • Data Scientist1 139
  • Бизнес-аналитик923
  • Аналитик данных856
  • Системный аналитик152

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

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

По регионам

  • Вакансии в США44 407
  • Вакансии в Европе23 791
  • Вакансии в Канаде4 523
  • Работа в России3 900

По формату

  • Удалённые вакансии75 163
  • Релокация в США44 450
  • Гибридная работа12 390
  • Офисная работа7 082

По уровню

  • Senior вакансии42 668
  • Middle вакансии20 908
  • Junior вакансии6 730

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

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

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

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

Что такое interior mutability в Rust? Как Cell<T> и RefCell<T> её обеспечивают?

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

Interior mutability — изменение данных через разделяемые (&T) ссылки. Cell<T> даёт Copy-семантику без блокировок, RefCell<T> — динамическую проверку borrow rules с возможностью получить &mut T во время выполнения.

Cell<T>

Cell<T> работает только с типами, реализующими Copy. Метод get() копирует значение, set() — заменяет. Нет ни указателей внутрь, ни блокировок, нет проверок во время выполнения — всё сводится к обычным операциям чтения/записи.

use std::cell::Cell;

struct Counter {
    value: Cell<u32>,
}

impl Counter {
    fn new() -> Self {
        Counter { value: Cell::new(0) }
    }

    // Принимает &self, но изменяет внутреннее состояние
    fn increment(&self) {
        self.value.set(self.value.get() + 1);
    }

    fn get(&self) -> u32 {
        self.value.get()
    }
}

fn main() {
    let c = Counter::new();
    c.increment();
    c.increment();
    println!("{}", c.get()); // 2
}

Interior Mutability в Rust

По умолчанию Rust запрещает изменение значения через &T. Interior mutability — паттерн, нарушающий это правило безопасным или явно небезопасным способом. Он реализован через типы из std::cell и примитивы синхронизации.

RefCell<T>

RefCell<T> работает с любыми типами, проверяет правила заимствования динамически (в runtime) и паникует при нарушении. borrow() возвращает Ref<T> (аналог &T), borrow_mut() — RefMut<T> (аналог &mut T). Одновременно допускается любое число Ref, но не более одного RefMut и без одновременных Ref.

use std::cell::RefCell;
use std::rc::Rc;

// Классический пример: граф с разделяемыми вершинами
#[derive(Debug)]
struct Node {
    value: i32,
    children: RefCell<Vec<Rc<Node>>>,
}

impl Node {
    fn new(value: i32) -> Rc<Self> {
        Rc::new(Node {
            value,
            children: RefCell::new(vec![]),
        })
    }

    fn add_child(&self, child: Rc<Node>) {
        self.children.borrow_mut().push(child);
    }
}

fn main() {
    let root = Node::new(1);
    let child1 = Node::new(2);
    let child2 = Node::new(3);

    root.add_child(Rc::clone(&child1));
    root.add_child(Rc::clone(&child2));

    println!("Children: {}", root.children.borrow().len()); // 2

    // Паника при нарушении правил borrow:
    // let _b1 = root.children.borrow();
    // let _b2 = root.children.borrow_mut(); // panic!
}

try_borrow и try_borrow_mut

Чтобы не паниковать, используйте безопасные версии: try_borrow() и try_borrow_mut(), возвращающие Result.

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

  • Cell<T> — примитивные Copy-типы (u32, bool), нет накладных расходов.
  • RefCell<T> — не-Copy типы, сложные структуры данных с несколькими владельцами через Rc<RefCell<T>>.
  • Mutex<T> / RwLock<T> — то же самое, но потокобезопасно (Send + Sync).

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

  • Паника RefCell в runtime трудно диагностировать в больших кодовых базах — prefer статические borrow rules везде, где возможно.
  • Cell и RefCell не являются Sync — нельзя шарить между потоками даже через Arc.
  • Держать RefMut живым через .await или через вызов функций, которые тоже заимствуют RefCell — верный путь к панике.
  • Циклические ссылки Rc<RefCell<T>> утекают память, так как счётчики никогда не упадут до нуля. Используйте Weak для слабых ссылок.
  • borrow_mut() возвращает guard — если сохранить его во временную переменную с именем _, он уничтожится сразу; используйте именованную переменную.
  • Частое использование RefCell — сигнал о плохой архитектуре; пересмотрите владение.

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

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

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

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

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

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

Источники

  • https://doc.rust-lang.org/book/
  • https://doc.rust-lang.org/cargo/reference/
←Предыдущий вопросРасскажите о случае, когда особенности Rust повлияли на архитектурное решение, производительность или сопровождение проекта.Следующий вопрос→Что такое трейт `Drop` и когда вызывается `drop()`?

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

Rustrisk-analysisrust-productiontechnical-depth

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

Rust вакансии
  • Embedded Software Engineer, Satellite Antenna (Starlink)
  • Software Engineer, Imaging
  • Engineering Manager, Bots & Fraud
  • Staff Software Engineer, Firefox Enterprise
  • Forward Deployed Software Engineer, Connected Warfare (Active Clearance)

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

  • Для каких задач Rust является сильным выбором, а где лучше честно выбрать другой язык?
  • Какие production-риски чаще всего возникают в проектах на Rust: производительность, зависимости, конкурентность, деплой или observability?
  • Как сравнить Rust с ближайшими альтернативами по производительности, поддерживаемости, найму и экосистеме?
  • Какие особенности runtime, type system или memory model Rust реально влияют на архитектуру приложения?