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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python16 420
  • Облачные технологии13 174
  • QA вакансии3 434
  • Backend вакансии2 036
  • Инженер данных1 672
  • Продакт-менеджер1 168

Разработка

  • Android1 816
  • iOS1 666
  • AI вакансии937
  • Fullstack вакансии892
  • Frontend вакансии717
  • Mobile вакансии38

По стеку

  • Go8 562
  • Java6 092
  • Node.js1 889
  • Kotlin1 554
  • .NET1 545
  • Rust1 433
  • PHP641
  • C#563
  • C++498

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

  • Kubernetes7 303
  • DevOps вакансии5 595
  • Linux-инфраструктура5 291
  • Terraform / IaC4 014
  • CI/CD2 559
  • Мониторинг и Observability1 735
  • SRE548
  • Кибербезопасность403

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

  • Data Scientist1 037
  • Бизнес-аналитик868
  • Аналитик данных830
  • Системный аналитик134

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

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

По регионам

  • Вакансии в США44 925
  • Вакансии в Европе21 347
  • Вакансии в Канаде4 453
  • Работа в России3 876

По формату

  • Удалённые вакансии74 108
  • Релокация в США44 925
  • Гибридная работа11 411
  • Офисная работа6 957

По уровню

  • Senior вакансии41 290
  • Middle вакансии20 424
  • Junior вакансии6 654

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

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab136 вакансий
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 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 вакансии
  • Senior Software Engineer, Marketing Technology
  • Middle Backend Developer (Java/Kotlin) Engineering Georgia Remote ETG
  • Sr. Model Engineer, Model Training
  • Sr. Model Engineer, Post-Training & RL
  • Sr. Model Engineer, Mid-training

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

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