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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

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

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

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

  • Data Scientist1 141
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

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

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

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

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

Все компании
  • 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 вакансии
  • Software Engineer, Full Stack (Data & Video Analysis)
  • Sr. Software Engineer, Full Stack (Data & Video Analysis)
  • Manager, Software Engineering
  • Senior Flutter Developer (AI)
  • Senior Data Engineer (ETL / GCP)

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

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