Взгляд на новую функцию Rust 1.64

Rust 1.64 вышел сегодня, и эта версия повлияет на сотни проектов всех типов в Интернете.

Причина этого в том, что он имеет ключевую функцию для любого проекта, разделенного на множество различных ящиков. Эта функция представляет собой наследование рабочей области, которая позволит нам совместно использовать поля, такие как номера версий или поля метаданных, между контейнерами. Файл Cargo.toml наконец-то начал следовать принципу DRY.

Попрощайтесь с копированием лицензий и авторов

Первое, что делает каждый при создании нового ящика, — открывает манифест предыдущего и копирует все разделы, общие для обоих, даже если они находятся в одной рабочей области.

Например, в репозитории, который я использую для демонстрации примеров кода, вы можете видеть, что у меня был один и тот же ключ authors в каждом ящике. Теперь я могу убрать все это дублирование. Как? Сначала сделаем корень Cargo.toml таким:

В этой новой версии в разделе [workspace.package] вы можете определить некоторые ключи раздела пакета, которые будут объявлены рабочим пространством по умолчанию.

Это позволит крейтам рабочей области подписаться и наследовать те разделы, которые одинаковы и в противном случае были бы дублированы (которые в этом примере являются всеми крейтами репозитория, как вы видите в workspace.members).

Теперь, чтобы использовать эти значения по умолчанию, нам просто нужно вызвать их в других манифестах. Например, сейчас add_trait/Cargo.toml:

Манифест add_trait теперь наследует значения, которые мы установили в корне для ключей, которые мы принесли с {key}.workspace, например edition или authors. Посмотрите также, как мы можем просто игнорировать тех, кого не хотим приносить, например readme, поскольку в этом ящике их не будет; или description, что отличается, и мы переопределяем.

С этим новым манифестом все проекты всегда будут использовать одну и ту же редакцию, а такие обновления, как изменение лицензии, не нужно будет обновлять вручную в каждом из них.

Синхронизируйте версии

Но есть еще одна вещь, которую мы можем сделать с этим новым наследием, и она будет ключевой в бизнес-проектах. Это использует наследование для обеспечения синхронности между зависимостями. Для этого мы можем использовать тот же подход, что и для [package], но используя [workspace.dependencies] и типичное объявление зависимостей (но мы не можем использовать здесь optional).

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

И теперь, в generify_with_compiler_errors, мы можем использовать эти зависимости с версией рабочей области и функциями, объявляя их в манифесте, как в следующем примере:

Посмотрите, как мы объявили vector2d так же, как и в рабочей области, но как мы переопределили зависимость num, поскольку этот ящик должен использовать функции по умолчанию, мы просто используем ту же версию. Этот крейт не использует rand, но я добавил его, чтобы показать, как вы можете объявлять функции поверх объявленных и добавлять зависимости не только в [dependencies], но также в [dev-dependencies] и [build-dependencies].

И это все на сегодня, если вы можете проверить всю новую версию Rust, вы можете сделать это здесь, а чтобы увидеть реальный код в работе, вы можете найти его, как всегда, в репозитории, указанном ниже.



Увидимся снова в Rust 1.65, мы будем смотреть на эти долгожданные GAT.