编译器认为布尔变量未使用

Gra*_*osi 0 shadowing rust

我正在使用 Rust 的会话类型,并且我有一个非常简单的函数,可以执行以下操作:

fn srv(c: Chan<(), Server>){
    let (c, n) = c.recv();
    let tmp = false;
    if n % 2 == 0 {
        let tmp = true;
    } else {
        let tmp = false;
    }
    let c = c.send(tmp);
    
    let (c, s) = c.recv();

    println!("server side: {}", s);


    c.close();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,rust 编译器认为该tmp变量未被使用。这对我来说似乎很奇怪,因为我将它传递给函数recv

fn srv(c: Chan<(), Server>){
    let (c, n) = c.recv();
    let tmp = false;
    if n % 2 == 0 {
        let tmp = true;
    } else {
        let tmp = false;
    }
    let c = c.send(tmp);
    
    let (c, s) = c.recv();

    println!("server side: {}", s);


    c.close();
}
Run Code Online (Sandbox Code Playgroud)

我尝试通过使其可变来玩弄,但这没有帮助。

如果我打印它,警告就会消失。但为什么当我将它用于发送功能时它仍然存在?

Aco*_*orn 9

因为我将它传递给recv函数。

不,那是/范围tmp之外定义的其他内容。ifelse

你想要什么:

let mut tmp = false;
if n % 2 == 0 {
    tmp = true;
} else {
    tmp = false;
}
Run Code Online (Sandbox Code Playgroud)

或者:

let tmp;
if n % 2 == 0 {
    tmp = true;
} else {
    tmp = false;
}
Run Code Online (Sandbox Code Playgroud)

或者:

let tmp = if n % 2 == 0 {
    true
} else {
    false
};
Run Code Online (Sandbox Code Playgroud)

或者:

let tmp = n % 2 == 0;
Run Code Online (Sandbox Code Playgroud)