Рассмотрим, как мы можем с помощью Cargo загружать и использовать внешние зависимости.
Следует сказать, что кроме собственно стандартной библиотеки типов и функциональностей, которая поставляется вместе с компилятором Rust и которые мы можем использовать по умолчанию в нашей программе, также есть куча различных пакетов, которые разрабатываются различными разработчиками по всему миру. Для хранения подобных пакетов существует централизованная система - https://crates.io/. И мы можем использовать эти пакеты в своей программе.
Рассмотрим на примере пакета https://crates.io/crates/rand, который позволяет задействовать в Rust случайные числа. Возьмем проект Cargo, созданный в прошлой теме (или создадим новый).
Если проект уже запускался, он будет выглядеть следующим образом:
В любом случае нас в проекте будет интересовать файл конфигурации проекта 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
При построении проекта Cargo проверяет секцию [dependencies]
и загружает все крейты (пакеты), которые отсутствуют. Кроме того, загружаются
пакеты, от которых зависит загружаемый пакет. После загузки пакетов Rust компилирует их и затем компилирует проект.
И таким образом, после запуска проекта мы увидим на консоли некоторое случайное число.
Если после последнего запуска никаких изменений в файл Cargo.toml не было произведено, то Cargo ничего заново не загружает и не компилирует, а использует ранее загруженные и скомпилированные пакеты. Если в код не было внесено никаких изменений, то при запуске через Cargo он также не перекомпилируется.
Однако что, если вышла новая версия пакета, и мы хотим использовать ее вместо старой? В этом случае нам достаточно изменить версию пакета в Cargo.toml
и выполнить команду:
cargo update