Rust 如何在调用函数时显示编译器警告?

Rust 如何在调用函数时显示编译器警告?,rust,compiler-warnings,static-analysis,Rust,Compiler Warnings,Static Analysis,我想在我的模块中导出一个函数,以便人们可以使用它。然而,在≈95%的情况下,使用它是一个坏主意 /// Check whether foo is a metasyntactic variable. /// /// **Using this function is a mistake.** This function is slow, /// since checking widgets is an extremely expensive operation. /// You should be

我想在我的模块中导出一个函数,以便人们可以使用它。然而,在≈95%的情况下,使用它是一个坏主意

/// Check whether foo is a metasyntactic variable.
/// 
/// **Using this function is a mistake.** This function is slow,
/// since checking widgets is an extremely expensive operation.
/// You should be keeping track of what's what, and ideally will
/// never need to use this function.
/// 
/// If you _do_ need to use this function, please consider a refactor.
pub fn test_widget(foo: String) -> bool {
    false
}
它主要用于文档和测试目的。然而,由于≈5%的情况下,这样的事情可能是真正有用的,我想保留它


我不希望人们意外地使用它,所以我想让函数的调用引起编译器警告(除非他们显式地用或什么重写它)。如何执行此操作?

您可以将函数标记为:

<代码> /请考虑总结并链接到文档,而不是放在文档中。 //全部信息在这里。 #[已弃用(注= “**使用此功能是一个错误** 这个功能很慢, 因为检查小部件是一项极其昂贵的操作。 你应该保持跟踪什么是什么,理想情况下会是什么 永远不需要使用此功能。 如果你需要使用这个函数,请考虑重构。 pub fn test_小部件(foo:String)->bool{ ///检查foo是否是元语法变量。 假的 } 如果用户使用该功能,则会收到警告:

警告:使用不推荐的项目“test_widget”:**使用此函数是错误的**
这个功能很慢,
因为检查小部件是一项极其昂贵的操作。
你应该保持跟踪什么是什么,理想情况下会是什么
永远不需要使用此功能。
如果你需要使用这个函数,请考虑重构。
但是他们可以使用
#[允许(不推荐)]
关闭它:


必须使用的
似乎适合这里,并允许指定自定义消息:

warning: unused `BadIdeaFunction` that must be used
  --> src/main.rs:23:5
   |
23 |     test_widget();
   |     ^^^^^^^^^^^^^^
   |
   = note: #[warn(unused_must_use)] on by default
   = note: Calling this function is a bad idea
#[must_use=“调用此函数是个坏主意”]
发布结构badideaffunction(bool);
impl BadIdeaFunction{
pub fn i\u acknowledge\u调用此函数是一个坏主意(self)->bool{
self.0
}
}
///检查foo是否是元语法变量。
///
///**使用此功能是错误的。**此功能速度较慢,
///因为检查小部件是一项极其昂贵的操作。
///你应该保持跟踪什么是什么,理想情况下会是什么
///永远不需要使用此功能。
///
//如果你需要使用这个函数,请考虑重构。
pub fn test_widget()->BadIdeaFunction{
BadIdeaFunction(错误)
}
fn main(){
test_widget();//给出警告,但下一个没有
test_widget().我承认调用这个函数是个坏主意();
}
这将创建带有自定义消息的警告:

warning: unused `BadIdeaFunction` that must be used
  --> src/main.rs:23:5
   |
23 |     test_widget();
   |     ^^^^^^^^^^^^^^
   |
   = note: #[warn(unused_must_use)] on by default
   = note: Calling this function is a bad idea

不,我不能仅仅依靠类型系统来跟踪这一点;在真实的示例中,这是测试应该由数据库处理的随着时间(和某些突变)而过期的项目的有效性。假设这个问题的前提是有效的,除非我遗漏了一些非常明显的东西。这个答案是有效的,但我并不喜欢它,因为它在语义上误用了
deprecated
属性。但这可能是目前唯一可用的方法。@Shepmaster我同意。在接受它之前,我会稍等片刻……但这似乎完成了我想要的,而且语义错误很小。@wizzwizz4顺序不重要;这是一个风格问题(文档注释变成了
#[doc]
属性)。我会把它放在后面。@Shepmaster?:D@mcarton实际上,我很喜欢它。这是一个有趣的解决方案,但它阻止人们正常使用该功能(而不仅仅是抱怨)。这让我想起了aptitude的提示,要求用户键入“是的,我知道这是一个非常糟糕的主意”(大写和全部)当有人试图卸载会破坏系统的软件包时。@trentcl你说得对!自动完成使这太容易绕过!很多人很快就对这个答案投了赞成票。有人能解释一下为什么这是个好答案吗?我不明白。老实说,我不太确定,但我不会太惊讶在野外看到这样的图案,尽管名字不那么可笑。