Перейти к основному содержимому

fn main() — бинарный crate и библиотека Rust

Разработчику

В Rust fn main() — точка входа исполняемого crate. Библиотека ([lib] в Cargo.toml) публикует функции и типы; main в ней не запускается при use mycrate::….

См. также: Первая программа · Cargo workspace · Python — аналог.


Бинарный crate по умолчанию

cargo new myapp создаёт:

// src/main.rs
fn main() {
println!("Hello, world!");
}
cargo run

Компилятор собирает бинарник и передаёт управление в main.


Библиотека + отдельный binary

cargo new --lib mylib создаёт src/lib.rs:

pub fn add(a: i32, b: i32) -> i32 {
a + b
}

Точка входа для демо — второй target или файл src/main.rs в том же проекте:

# Cargo.toml
[lib]
name = "mylib"
path = "src/lib.rs"

[[bin]]
name = "mylib-demo"
path = "src/main.rs"
// src/main.rs
fn main() {
println!("{}", mylib::add(5, 3));
}
КомандаЧто происходит
cargo runЗапуск default binary (main.rs)
use mylib::add из другого crateТолько API из lib.rs, без main

examples/ и tests

Для библиотек демо часто кладут в examples/demo.rs:

cargo run --example demo

Юнит-тесты — в #[cfg(test)] mod tests внутри lib.rs; они не попадают в release-сборку.

Это замена Python-паттерну «демо в if __name__ == "__main__" в том же файле».


main с Result

fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = load_config()?;
run_server(config)?;
Ok(())
}

Ошибки из ? в main с такой сигнатурой превращаются в код выхода процесса.


Сравнение с Python

PythonRust
Один .py — модуль и скриптlib.rs vs main.rs / [[bin]]
if __name__ == "__main__":Отдельный binary target или examples/
Import выполняет top-level кодuse только подтягивает items; main чужого crate не вызывается

Дальше по разделу

ТемаСтатья
cargo new, первая сборка20 — Первая программа
Модули12 — Синтаксис
Тесты202 — Тестирование

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").