Подтвердить что ты не робот

Могу ли я отметить функцию как устаревшую?

Я хотел бы отметить функции/методы как устаревшие. Я попытался применить атрибут deprecated:

#[deprecated]
fn old_way_of_doing_it() {

но это дает ошибку:

error: stability attributes may not be used outside of the standard library

Есть ли способ, с помощью которого компилятор может предупредить пользователя моей библиотеки о том, что функция устарела?

У меня нет опыта, но я рассматриваю возможность экспериментировать с плагинами компилятора и настраиваемыми атрибутами, но я предполагаю, что потребитель должен использовать плагин, который, возможно, необоснован (или может быть необоснованным количеством работы для меня реализовать?)

Как побочный вопрос из любопытства, почему устаревший атрибут применим только к стандартной библиотеке?

4b9b3361

Ответ 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].