我可以将一个函数标记为弃用吗?

46

我想标记函数/方法已过时。我尝试使用 deprecated 属性:

#[deprecated]
fn old_way_of_doing_it() {
但是这会产生一个错误:
error: stability attributes may not be used outside of the standard library
有没有一种方法可以使编译器警告我的库的使用者函数已被弃用?我没有经验,但我正在考虑尝试编译器插件和自定义属性,但我猜这需要使用者也使用插件,这可能是不合理的(或者对我来说需要太多工作了?)另外一个好奇的问题,为什么弃用属性只适用于标准库?
2个回答

45
Rust 1.9.0 (2016 May 26th)版本以来,您可以在自己的crate中使用#[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中找到更多信息。


它能工作吗?我得到了以下错误:error: This deprecation annotation is useless = note: #[warn(unused_imports)] on by default - xliiv
2
@xliiv,你不能在 impl Trait for Type 中放置弃用的属性。请将属性直接放在 trait Trait 内的方法上。 - kennytm

11

更新: #[deprecated] 目前(截至 2016 年 2 月)在夜间版本中可用。预计将于 2016 年 3 月初之前稳定发布。

目前还无法在外部库中实现此功能。

虽然这样做非常理想(我肯定有几次想要这样做),但决定把设计和实现工作重点放在标准库在 1.0 版本所需的功能上,并将优化外部库的设计推迟到以后。关于此问题,RFC 进行了一些讨论:

需要注意的是,由于与语言版本和发布渠道的显式链接,这些稳定性属性仅被认为对标准发行版有用。[...] 将来将重新考虑指示 API 稳定性的通用机制。

[...]

关于稳定性属性和 Cargo,提议的设计非常特定于标准库和 Rust 编译器,并不打算供第三方库使用。计划通过扩展 Cargo 对功能的支持(不同于 Rust 功能)来启用这种形式的功能开发,并通过 Cargo 以一流的方式完成。然而,目前还没有具体的计划进行这种设计,不太可能很快发生。

在拉请求本身上也有很多讨论:

(该 RFC 是有关此问题的权威来源。)

我没有相关经验,但我考虑尝试编写编译器插件和自定义属性。但我想这需要使用者也使用该插件,这可能是不合理的(或者可能需要我实现的工作量过大?)

是的,这确实需要使用者使用插件。而且我不确定编译器是否能够轻松地使插件获取所有信息以模拟当前内置的#[deprecated]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接