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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

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

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

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

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

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

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

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

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

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

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

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

Что такое pattern matching в Rust и как работает выражение match?

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

Pattern matching в Rust — механизм деструктуризации и ветвления, где компилятор статически проверяет полноту (exhaustiveness) покрытия всех вариантов. Выражение match сравнивает значение с паттернами последовательно и выполняет первый совпавший arm.

Базовый синтаксис match

Выражение match — это не оператор switch, а выражение, возвращающее значение. Компилятор требует покрытия всех возможных значений (exhaustive matching):

#[derive(Debug)]
enum HttpStatus {
    Ok,
    NotFound,
    InternalError(String),
    Redirect { code: u16, location: String },
}

fn describe(status: HttpStatus) -> String {
    match status {
        HttpStatus::Ok => String::from("200 OK"),
        HttpStatus::NotFound => String::from("404 Not Found"),
        HttpStatus::InternalError(msg) => format!("500: {}", msg),
        HttpStatus::Redirect { code, location } => {
            format!("{}  -> {}", code, location)
        }
    }
}

Если добавить новый вариант в enum и не обновить match — ошибка компиляции. Это ключевое преимущество перед switch/case в других языках.

Паттерны: полный арсенал

let x: i32 = 7;

match x {
    0 => println!("ноль"),
    1..=5 => println!("от 1 до 5"),      // range pattern
    6 | 7 | 8 => println!("6, 7 или 8"), // or pattern
    n if n > 100 => println!("большое: {}", n), // guard
    _ => println!("что-то другое"),      // wildcard
}

Деструктуризация структур и кортежей

struct Point { x: i32, y: i32 }

let p = Point { x: 3, y: -5 };

match p {
    Point { x: 0, y } => println!("на оси Y, y={}", y),
    Point { x, y: 0 } => println!("на оси X, x={}", x),
    Point { x, y } if x == y => println!("на диагонали"),
    Point { x, y } => println!("({}, {})", x, y),
}

// Кортежи
let pair = (true, 42);
match pair {
    (true, n) => println!("true и {}", n),
    (false, _) => println!("false"),
}

Binding (@) — захват с проверкой

let num = 15u32;

match num {
    n @ 1..=12 => println!("месяц {}", n),
    n @ 13..=19 => println!("подросток {}", n),
    n => println!("другое: {}", n),
}

if let и while let — сокращённые формы

// if let: когда интересует только один вариант
let config_port: Option<u16> = Some(8080);
if let Some(port) = config_port {
    println!("порт: {}", port);
}

// if let с else
if let Ok(n) = "42".parse::<u32>() {
    println!("число: {}", n);
} else {
    println!("не число");
}

// while let: читать из канала пока есть значения
use std::collections::VecDeque;
let mut stack: VecDeque<i32> = VecDeque::from([1, 2, 3]);
while let Some(top) = stack.pop_back() {
    println!("{}", top);
}

Паттерны в let и аргументах функций

// Деструктуризация в let
let (a, b, c) = (1, 2, 3);
let Point { x, y } = Point { x: 10, y: 20 };

// Деструктуризация в аргументах
fn print_point(&(x, y): &(i32, i32)) {
    println!("({}, {})", x, y);
}

// В for-цикле
let pairs = vec![(1, 'a'), (2, 'b')];
for (num, ch) in &pairs {
    println!("{}: {}", num, ch);
}

matches! — макрос для булевой проверки

let status = HttpStatus::NotFound;

// Вместо: matches!(status, HttpStatus::NotFound | HttpStatus::Ok)
let is_client_or_ok = matches!(status, HttpStatus::NotFound | HttpStatus::Ok);

// Полезно в filter:
let statuses = vec![HttpStatus::Ok, HttpStatus::NotFound, HttpStatus::Ok];
let ok_count = statuses.iter().filter(|s| matches!(s, HttpStatus::Ok)).count();

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

  • Незакрытый wildcard _ скрывает ошибки: добавление _ => unreachable!() вместо перечисления вариантов означает, что новый вариант enum не вызовет ошибку компиляции — только панику в рантайме.
  • Перемещение в match: match по значению перемещает его. Если нужен доступ к оригиналу после match, используйте match &value или ref в паттерне.
  • Guard не участвует в exhaustiveness: n if n > 0 не закрывает все i32. После guard-паттерна нужен явный _ => или паттерн без guard.
  • Порядок arm имеет значение: паттерны проверяются сверху вниз. Более конкретные паттерны должны идти раньше широких, иначе они никогда не сработают (компилятор предупреждает).
  • Связывание в or-паттернах: в паттерне A(x) | B(x) переменная x должна иметь одинаковый тип в обоих вариантах, иначе ошибка компиляции.
  • Деструктуризация с ..: Point { x, .. } игнорирует остальные поля. Удобно, но при добавлении поля в структуру компилятор не напомнит обновить match.
  • match на строках: нельзя использовать String в паттернах напрямую — только &str. match s.as_str() { "foo" => ... }.
  • Вложенный match vs комбинаторы: глубокая вложенность match снижает читаемость. Для Option/Result предпочтительны map, and_then, ?.

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

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

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

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

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

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

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

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

Источники

  • https://doc.rust-lang.org/book/
  • https://doc.rust-lang.org/cargo/reference/
←Предыдущий вопросВ чём разница между `if let` и `match`?

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

Rustrisk-analysisrust-productiontechnical-depth

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

Rust вакансии
  • Senior Software Engineer (Python)
  • Specialist Software Engineer
  • Software Engineer in Test
  • Software Engineer (Backend - Typescript Focused)
  • Lead Backend Developer