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

时间:2015-06-10 13:32:40

标签: rust

我想将函数/方法标记为已弃用。我尝试应用deprecated属性:

#[deprecated]
fn old_way_of_doing_it() {

但这会产生错误:

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

有没有一种方法可以让编译器警告我的库的使用者不推荐使用某个函数?

我没有经验,但我正在考虑尝试编译器插件和自定义属性,但我想这会要求消费者也使用插件,这可能是不合理的(或者可能是不合理的工作量)让我实施?)

作为好奇心的一个侧面问题,为什么不推荐使用的属性仅适用于标准库?

2 个答案:

答案 0 :(得分:28)

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

答案 1 :(得分:9)

更新: #[deprecated]目前(截至2016年2月)每晚提供。它应该在2016年3月初左右稳定下来。

然而,在外部库中无法做到这一点。

这样做是非常可取的(我当然希望它多次),但决定将设计和实施工作集中在1.0标准库所需的功能上,并推迟优化外部库的设计到后来。 RFC稍微讨论了一下:

  

重要的是要注意,这些稳定性属性仅对标准分布有用,因为它们与语言版本和发布通道有明确的联系。 [...]。将来会重新考虑指示API稳定性的一般机制。

     

[...]

     

关于稳定性属性和Cargo,所提出的设计非常特定于标准库和Rust编译器,而不是供第三方库使用。计划扩展Cargo自己对功能的支持(与Rust功能不同),通过Cargo以一流的方式实现这种形式的功能开发。然而,目前还没有针对这种设计的具体计划,也不太可能很快发生。

拉力请求本身也有重要的讨论:

(RFC是有关此信息的规范来源。)

  

我没有经验,但我正在考虑尝试编译器插件和自定义属性,但我想这会要求消费者也使用插件,这可能是不合理的(或者对我来说可能是不合理的工作量)实施?)

是的,它需要消费者使用该插件,我不完全确定编译器是否使插件能够轻松获取模拟当前内置#[deprecated]所需的所有信息

相关问题