Rust - 是真的还是假的

6
如何正确读取用户输入的字符串(“true”或“false”)作为布尔型 - true或false,并对其执行操作?不使用len()这种基本方法?
fn main() {
    loop {
        println!("Input condition - true or false");

        let mut condition = String::new();

        io::stdin()
            .read_line(&mut condition)
            .expect("failed to read input.");

        let len = calculate_length(&condition);

        // println!("The length of '{}' is {}.\n", &condition, &len);

        fn calculate_length(condition: &String) -> usize {
            condition.len()
        }

        match len == 5 {
            true => {
                let number = 100;
                println!("The value of number is: {}", &number);
            }

            _ => {
                let number = 7;
                println!("The value of number is: {}", &number);
            }
        };

        break;
    }
}

这与Rust或任何特定的编程语言无关 - 没有明显的将字符串转换为布尔值的“规范”方式。哪些字符串被视为true,哪些被视为false - 如果用户输入了一个随机字符串,例如“kylj”怎么办?您需要自己决定逻辑并实现它 - 例如,如果输入为“true”,则采用一种方式,如果输入为“false”,则采用另一种方式,并在输入其他内容时再次提示用户进行“正确”的输入。 - Robin Zigmond
6
@RobinZigmond,对于 bool 类型,已经有一个 FromStr 实现,这似乎是将字符串转换为布尔值的常见方式。 - Ivan C
@IvanC - 很公正的观点,我刚查了一下。我对Rust不太熟悉,忘了它有带有关联类型的特性,这使得这个想法比大多数其他编程语言更合理。尽管如此,我仍然认为它是相当任意的 - 它似乎很高兴将"true"和"false"转换,但是如果你想让"True"和"False"等也计入其中呢?如果你想要"t"和"f",或者"1"和"0"怎么办?虽然Rust拥有这个功能似乎很方便,但它并不能总是替代自己编写逻辑的必要性。 - Robin Zigmond
2个回答

8
您可能需要这样的内容:
let truth_value: bool = match condition {
   "true" => true,
   "t" => true,
   "false" => false,
   "f" => false,
   ... any other cases you want
   _ => false  // Or whatever appropriate default value or error.
}

那么您的truth_value变量将是一个布尔型。通常这种功能被嵌入到FromStr实现中,但严格来说并不需要。


10
可以缩短为let truth_value = matches!(condition, "true" | "t" | "1") - user2722968
2
感谢所有编程领域的前辈们为我们做出的贡献。也许这只是一个“小问题”,但收到你们的答案真的很好。你们的建议对我们非常有帮助。 - Gkey

7

Rust针对许多类型都有本地的FromStr实现,包括bool,通常通过str::parse调用:

if condition.trim().parse().unwrap() {
    // true branch
} else {
    // false branch
}

此实现仅匹配精确字符串 "true""false",因此更适合反序列化而非用户交互。特别是在解析之前需要删除 condition 结尾处的换行符(使用.trim())。

这里使用 unwrap 仅用于演示 - 有关 Rust 中错误处理的更多信息,请参见 The Rust Programming Language 的错误处理章节


熟悉 Rust 后,您可以使用类似于 dialoguer 这样的 crate 来呈现选择提示:

use dialoguer::Select;

fn main() -> anyhow::Result<()> {
    let selection = Select::new().item("Choice 1").item("Choice 2").interact()?;

    match selection {
        0 => eprintln!("Choice 1 was selected."),
        1 => eprintln!("Choice 2 was selected."),
        _ => unreachable!(),
    }

    Ok(())
}

(使用 anyhow 进行错误处理)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接