【问题标题】:How to disable unused code warnings in Rust?如何在 Rust 中禁用未使用的代码警告?
【发布时间】:2014-11-10 16:56:01
【问题描述】:
struct SemanticDirection;

fn main() {}
warning: struct is never used: `SemanticDirection`
 --> src/main.rs:1:1
  |
1 | struct SemanticDirection;
  | ^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[warn(dead_code)] on by default

如果出现严重问题,我会重新打开这些警告,但我只是在修改语言,这让我很生气。

我尝试将#[allow(dead_code)] 添加到我的代码中,但没有成功。

【问题讨论】:

    标签: warnings compiler-warnings rust dead-code


    【解决方案1】:

    请将这两行放在文件的顶部。

    #![allow(dead_code)]
    #![allow(unused_variables)]
    

    【讨论】:

    • 这两者有什么区别? #[allow(dead_code)] 无效,但 #![allow(dead_code)] 有效。
    • @jwkoo !使其适用于整个箱子
    【解决方案2】:

    对于未使用的函数,您应该公开该函数,但要小心。如果结构不是公开的,那么您仍然会收到如下错误:

    //this should be public also
    struct A{
       A{}
    }
    
    impl A {
        pub fn new() -> A {
    
        }
    }
    

    或者如果你不想公开,你应该把#[allow(unused)]

    【讨论】:

      【解决方案3】:

      您始终可以通过在变量名称中添加 (_) 来禁用未使用的变量/函数,如下所示:

      let _variable = vec![0; 10];
      

      【讨论】:

      • antoyo 的回答已经涵盖了这种方法。
      【解决方案4】:

      另外:rust 提供了四个级别的 lints(允许、警告、拒绝、禁止)。

      https://doc.rust-lang.org/rustc/lints/levels.html#lint-levels

      【讨论】:

        【解决方案5】:

        您可以:

        • 在结构、模块、函数等上添加allow 属性:

          #[allow(dead_code)]
          struct SemanticDirection;
          
        • 添加crate-level allow attribute;注意!:

          #![allow(dead_code)]
          
        • 将其传递给rustc:

          rustc -A dead_code main.rs
          
        • 通过RUSTFLAGS 环境变量使用cargo 传递它:

          RUSTFLAGS="$RUSTFLAGS -A dead_code" cargo build
          

        【讨论】:

        • 注意最后一个会触发所有内容的重新编译。
        【解决方案6】:

        将代码设为public 也会停止警告;您还需要将封闭的mod 公开。

        这在您编写库时是有道理的:您的代码在内部是“未使用的”,因为它旨在供客户端代码使用。

        【讨论】:

        • 我认为如果 crate 包含 main.rs 和 lib.rs,并且 main.rs 不使用问题中的函数,这将不起作用。
        【解决方案7】:

        另一种禁用此警告的方法是在标识符前面加上_

        struct _UnusedStruct {
            _unused_field: i32,
        }
        
        fn main() {
            let _unused_variable = 10;
        }
        

        这可能很有用,例如,对于 SDL 窗口:

        let _window = video_subsystem.window("Rust SDL2 demo", 800, 600);
        

        使用下划线作为前缀与使用单独的下划线作为名称不同。执行以下操作将立即破坏窗口,这不太可能是预期的行为。

        let _ = video_subsystem.window("Rust SDL2 demo", 800, 600);
        

        【讨论】:

        • “分配给下划线会破坏它”的行为似乎很奇怪(尽管我不怀疑你是正确的)。你有它的参考吗?
        • @MichaelAnderson 请参阅“RAII。您可能希望存在一个变量来解决其析构函数的副作用,但不要使用它。对于这个用例,不能简单地使用 _,因为 _不是变量绑定,并且该值将在语句末尾删除。”来自stackoverflow.com/a/48361729/109618
        • 使用 let _ = 值将在语句的末尾被删除,而不是在块的末尾
        • 如果您想详细了解原因,原因是let X = Y 中的X 是一个无可辩驳的模式(即,它就像可以证明永远不会出错的match 手臂在编译时),并且与可反驳的模式一样,_ 是一个不将任何内容绑定到变量的通配符。这就是为什么以及如何进行let (x, y) = foo(); 和其他类似的拆包。这只是另一种无可辩驳的模式。
        猜你喜欢
        • 1970-01-01
        • 2022-09-23
        • 2020-11-04
        • 1970-01-01
        • 2011-03-23
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多