Могу ли я отметить функцию как устаревшую?
Я хотел бы отметить функции/методы как устаревшие. Я попытался применить атрибут deprecated
:
#[deprecated]
fn old_way_of_doing_it() {
но это дает ошибку:
error: stability attributes may not be used outside of the standard library
Есть ли способ, с помощью которого компилятор может предупредить пользователя моей библиотеки о том, что функция устарела?
У меня нет опыта, но я рассматриваю возможность экспериментировать с плагинами компилятора и настраиваемыми атрибутами, но я предполагаю, что потребитель должен использовать плагин, который, возможно, необоснован (или может быть необоснованным количеством работы для меня реализовать?)
Как побочный вопрос из любопытства, почему устаревший атрибут применим только к стандартной библиотеке?
Ответы
Ответ 1
Поскольку Rust 1.9.0 (2016 26 мая), вы можете использовать атрибут #[deprecated]
в своих собственных ящиках (RFC 1270). Синтаксис:
#[deprecated(since="0.5.0", note="please use `new_method` instead")]
pub fn old_method() { ..; }
При каждом использовании old_method
он будет предупреждать следующее:
<anon>:6:5: 6:15 warning: use of deprecated item: please use `new_method` instead, #[warn(deprecated)] on by default
<anon>:6 old_method()
^~~~~~~~~~
Вы можете найти дополнительную информацию в RFC.
Ответ 2
Обновление: #[deprecated]
в настоящее время (по состоянию на февраль 2016 года) доступно в ночное время. Он должен быть доступен в стабильном состоянии примерно в начале марта 2016 года.
Во внешних библиотеках пока нет возможности.
Делать это очень желательно (я, разумеется, хотел его несколько раз), но было принято решение сосредоточить усилия на разработке и внедрении на функциональность, которая была необходима стандартной библиотеке в версии 1.0, и отложить оптимизацию дизайна для внешних библиотек до поздней. RFC обсуждает это немного:
Важно отметить, что эти атрибуты стабильности известны только для того, чтобы быть полезными для стандартного распространения из-за явной привязки к языковым версиям и каналам выпуска. [...]. В будущем будет пересмотрен общий механизм определения стабильности API.
[...]
Что касается атрибутов стабильности и Cargo, предлагаемый дизайн очень специфичен для стандартной библиотеки и компилятора Rust, не предназначен для использования сторонними библиотеками. Планируется расширить собственную поддержку Cargo для функций (отличных от функций Rust), чтобы включить эту форму разработки функций в первоклассный метод через Cargo. В настоящее время, однако, конкретных планов для этого проекта нет, и вряд ли это произойдет в ближайшее время.
Было также важное обсуждение самого запроса на тягу:
(Этот RFC является каноническим источником информации об этом.)
У меня нет опыта, но я рассматриваю возможность экспериментировать с плагинами компилятора и настраиваемыми атрибутами, но я предполагаю, что потребитель должен использовать плагин, который, возможно, необоснован (или может быть необоснованным количеством работы для меня реализовать?)
Да, это потребует, чтобы потребитель использовал плагин, и я не совсем уверен, что компилятор упрощает плагин для получения всей необходимой им информации для эмуляции текущего встроенного #[deprecated]
.