Загрузка и использование внешних зависимостей

Последнее обновление: 05.05.2021

Рассмотрим, как мы можем с помощью Cargo загружать и использовать внешние зависимости.

Следует сказать, что кроме собственно стандартной библиотеки типов и функциональностей, которая поставляется вместе с компилятором Rust и которые мы можем использовать по умолчанию в нашей программе, также есть куча различных пакетов, которые разрабатываются различными разработчиками по всему миру. Для хранения подобных пакетов существует централизованная система - https://crates.io/. И мы можем использовать эти пакеты в своей программе.

Рассмотрим на примере пакета https://crates.io/crates/rand, который позволяет задействовать в Rust случайные числа. Возьмем проект Cargo, созданный в прошлой теме (или создадим новый).

Если проект уже запускался, он будет выглядеть следующим образом:

Dependency in Rust

В любом случае нас в проекте будет интересовать файл конфигурации проекта Cargo.toml и файл кода main.rs из папки src.

Прежде всего укажем в файле Cargo.toml зависимость, которую надо загрузить и которую мы собираемся использовать. По умолчанию он выглядит примерно таким образом:

[package]
name = "hello"
version = "0.1.0"
authors = ["Eugene <metanit22@mail.ru>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

Конкретные данные в случае имени проекта и авторов могут отличаться, однако секция [dependencies] по умолчанию пуста. Именно в этой секции указываются внешние пакеты, которые надо загрузить.

Изменим данную секцию следующим образом:

[dependencies]
rand = "0.8.3"

Вначале идет название крейта или пакета - "rand", а после знака равно его версия. То есть в моем случае весь файл Cargo.toml будет выглядеть следующим образом:

[package]
name = "hello"
version = "0.1.0"
authors = ["Eugene <metanit22@mail.ru>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rand = "0.8.3"

Теперь перейдем к файлу main.rs и изменим его код следующим образом:

use rand::Rng;	// используем пакет rand

fn main() {
    let random_number = rand::thread_rng().gen_range(0..10);

    println!("Сгенерированное число: {}", random_number);
}

Вначале здесь подключается тип (трейт) rand::Rng из пакета rand. Трейт Rng определяет ряд методов, в частности, метод gen_range(), который принимает в качестве параметра последовательность и возвращает случайное число из этой последовательности.

Чтобы получить случайное число, сначала обращаемся к функции rand::thread_rng(), которая возврашает объект структуры rand::rngs::ThreadRng. Для этой структуры реализован трейт rand:Rng, и соответственно через ее объект можно вызвать метод gen_range() для генерации случайного числа:

let random_number = rand::thread_rng().gen_range(0..10);

То есть в данном случае мы получим случайное число из диапазона от 0 до 10.

Теперь построим и запустим проект командой

cargo run
Загрузка и компиляция пакетов в Rust через Cargo

При построении проекта Cargo проверяет секцию [dependencies] и загружает все крейты (пакеты), которые отсутствуют. Кроме того, загружаются пакеты, от которых зависит загружаемый пакет. После загузки пакетов Rust компилирует их и затем компилирует проект.

И таким образом, после запуска проекта мы увидим на консоли некоторое случайное число.

Если после последнего запуска никаких изменений в файл Cargo.toml не было произведено, то Cargo ничего заново не загружает и не компилирует, а использует ранее загруженные и скомпилированные пакеты. Если в код не было внесено никаких изменений, то при запуске через Cargo он также не перекомпилируется.

Однако что, если вышла новая версия пакета, и мы хотим использовать ее вместо старой? В этом случае нам достаточно изменить версию пакета в Cargo.toml и выполнить команду:

cargo update
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850