我使用String :: from(“string”)来获取String
let dog = String::from("dog")
和
dog == String::from("dog")
返回false。即使在模式匹配中也是如此。
match dog.as_ref() {
"dog" => println!("Dog is a dog"), //no output
_ => println!("Dog is not a dog")
}
有什么问题?
示例
use std::io;
fn main() {
let mut sure = String::from("");
println!("Hello, world!");
println!("Are you sure(Y/N)");
io::stdin().read_line(&mut sure).expect("Failed");
println!("sure {}", sure );
let surely = {sure == String::from("Y")};
println!("surely {} ", surely ); //this line output is "surely false"
if surely {
dog_loop("HA");
}
}
答案 0 :(得分:1)
作为一般规则,在比较Rust中的字符串时,最好将字符串转换为&str
以与字符串文字进行比较,而不是将字符串文字转换为String
。原因是后者需要创建对象(分配String
),而第一个不需要,因此效率更高。
您在此处看到的具体问题来自于您的输入没有多余的空白被剥离的事实。行后
io::stdin().read_line(&mut sure).expect("Failed");
sure
的值不是您所期望的"Y"
,但在Unix上实际上是"Y\n"
,在Windows上是"Y\r\n"
。您可以通过修改比较直接对此进行比较:
let surely = {sure.as_str() == "Y\n"};
println!("surely {} ", surely );
你会看到它“肯定是真的”。但是,这会使您的代码依赖于平台。最好使用字符串方法String.trim()
,它将删除尾随空格。