我想将函数/方法标记为已弃用.我试图应用该deprecated属性:
#[deprecated]
fn old_way_of_doing_it() {
Run Code Online (Sandbox Code Playgroud)
但这会产生错误:
Run Code Online (Sandbox Code Playgroud)error: stability attributes may not be used outside of the standard library
有没有一种方法可以让编译器警告我的库的使用者不推荐使用某个函数?
我没有经验,但我正在考虑尝试使用编译器插件和自定义属性,但我想这会要求消费者也使用插件,这可能是不合理的(或者对我来说可能是一项不合理的工作量? )
作为好奇心的一个侧面问题,为什么被弃用的属性仅适用于标准库?
ken*_*ytm 29
自Rust 1.9.0(2016年5月26日)起,您可以#[deprecated]在自己的包中使用该属性(RFC 1270).语法是:
#[deprecated(since="0.5.0", note="please use `new_method` instead")]
pub fn old_method() { ..; }
Run Code Online (Sandbox Code Playgroud)
无论何时使用,它都会抛出以下警告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()
^~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
您可以在RFC中找到更多信息.
更新: #[deprecated]目前(截至2016年2月)每晚提供.它应该在2016年3月初左右稳定提供.
但是,在外部库中没有办法做到这一点.
这样做是非常可取的(我当然希望它多次),但是决定将设计和实现工作集中在标准库1.0所需的功能上,并推迟优化外部库的设计直到以后.该RFC讨论这一点:
重要的是要注意,这些稳定性属性仅对标准分布有用,因为它与语言版本和发布通道有明确的联系.[...].将来会重新考虑指示API稳定性的一般机制.
[...]
关于稳定性属性和Cargo,所提出的设计非常特定于标准库和Rust编译器,而不是供第三方库使用.计划扩展Cargo自己对功能的支持(与Rust功能不同),通过Cargo以一流的方式实现这种形式的功能开发.然而,目前还没有针对这种设计的具体计划,也不太可能很快发生.
拉动请求本身也有重要的讨论:
(RFC是有关此信息的规范来源.)
我没有经验,但我正在考虑尝试使用编译器插件和自定义属性,但我想这会要求消费者也使用插件,这可能是不合理的(或者对我来说可能是一项不合理的工作量? )
是的,它需要消费者使用插件,我不完全确定编译器是否使插件能够轻松获得模拟当前内置所需的所有信息#[deprecated].