rust 优雅的方式来防止未使用的任务?

cqoc49vn  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(142)

上下文

有时候,我发现严格的类型警告更容易分散注意力,而不是有用的,同时仍然把一些想法变成代码,并且在审查它的合理性之前。
我正在寻找一种快速的编程方法来防止“未使用的声明”警告,以提高我的工作流程。

示例

我将试着用一个例子来说明我的意思。

// use rand::Rng;

fn breaking_out_of_nested_loops_using_labels() {
    let mut innermost_loop_reached: bool = false;

    'outermost_loop: loop {
        loop {
            // if rand::thread_rng().gen::<u8>() >= u8::MAX / 2 {
            //    break;
            // }

            loop {
                innermost_loop_reached = true;
                break 'outermost_loop;
            }
        }
    }

    println!(
        "Inner loop was {}reached",
        if innermost_loop_reached { "" } else { "not " }
    )
}

字符串
该代码将产生以下警告:
x1c 0d1x的数据
显然编译器是正确的。

问题

我很好奇是否有一种快速的方法可以在输入初始代码时“欺骗”或忽略未使用的赋值警告,而您只想知道代码是否仍然可以编译。
有经验的rust程序员是如何做到这一点的呢?或者你只是学会了忽略警告,直到你准备好处理它们?
请注意
注解掉的代码是我用来防止弹出警告的,同时仍然尝试代码。显然导入一个crate并使用一个随机条件是一个很大的工作,所以它不是理想的。
在这一点上,我可能会把#[allow(unused_assignments)]-allow-rule放在我的函数之上。

  • 我可能会忘记把它取下来。
  • 如果我必须从编译器输出中复制警告,它已经中断了我的工作流程。
mjqavswn

mjqavswn1#

您可以通过rustc标志来控制lint级别-例如-A unused_assignments将消除未使用的分配警告。
您可以配置Cargo,使其在调用rustcusing a config.toml文件时应用特定的标志,您可以将其放置在项目中,或~/.cargo/config.toml中,或其他一些地方-请参阅cargo文档。
您可以将所需的rust标志放置在[build]部分中,如下所示:

[build]
rustflags = ["-A", "unused_assignments"]

字符串
当然,当你完成了最初的实验性编码阶段时,你仍然需要记住删除它,但至少它不会散布在你的代码中。
不幸的是,还不能为每个配置文件设置rustflags-如果能够降低debug的警告,但保留release的警告,那就太好了。有一个feature request开放,所以也许将来会有可能。
你也可以用RUSTFLAGS环境变量来控制rust参数,但我发现这对于IDE之类的环境来说用处不大,这可能会让你很难控制cargo运行的环境变量。

ryevplcw

ryevplcw2#

您可以尝试将变量命名为_innermost_loop_reached
在变量名的开头添加下划线可以防止编译器显示unused_assignments警告。

vq8itlhq

vq8itlhq3#

一个解决方案是完全避免这个问题,利用loop可以是一个表达式的事实,并将该表达式分配给innermost_loop_reached

fn breaking_out_of_nested_loops_using_labels() {
    // Directly assign to `innermost_loop_reached`
    let innermost_loop_reached: bool = 'outermost_loop: loop {
        loop {
            if rand::thread_rng().gen::<u8>() >= u8::MAX / 2 {
                break;
            }

            loop {
                // break directly to the top-loop, "returning" `true`
                break 'outermost_loop true;
            }
        }
        // "return" `false`
        break false;
    };

    println!(
        "Inner loop was {}reached",
        if innermost_loop_reached { "" } else { "not " }
    )
}

字符串
这样做还有一个好处,就是所有从循环中退出(通过break)必须bool类型,因为innermost_loop_reached是一个bool。也就是说,你可以避免大多数情况下innermost_loop_reached应该在循环中得到一个值,但却没有,错误地保留了你的例子中的默认值false

lf3rwulv

lf3rwulv4#

我是Rust的新手。rustccargo的当前版本都是1.74.1。我在我的包清单Cargo.toml中添加了以下内容:

[lints.rust]
unused_assignments = "allow"
#unused_variables   = "allow"

字符串
更多信息可查阅
https://doc.rust-lang.org/cargo/reference/manifest.html#the-lints-section

相关问题