2015-07-21 140 views
3

在学习Rust的练习中,我正在尝试一个简单的程序来接受你的名字,然后打印你的名字,如果它是有效的。如何匹配从标准输入读取的字符串?

只有“Alice”和“Bob”是有效名称。

use std::io; 

fn main() { 
    println!("What's your name?"); 
    let mut name = String::new(); 

    io::stdin().read_line(&mut name) 
    .ok() 
    .expect("Failed to read line"); 

    greet(&name); 
} 

fn greet(name: &str) { 
    match name { 
     "Alice" => println!("Your name is Alice"), 
     "Bob" => println!("Your name is Bob"), 
     _ => println!("Invalid name: {}", name), 
    } 
} 

当我cargo run这个main.rs文件,我得到:

What's your name? 
Alice 
Invalid name: Alice 

现在,我的猜测是,因为 “爱丽丝” 是&'static str型和name&str型的,也许它不匹配正确...

+2

尝试'match name.trim(){...}'。我目前无法测试,但我敢打赌,输入中有一个换行符。 –

+0

就是这样......我总是忘记这一点,谢谢!如果你发布答案,我会赞成并接受。 – sircapsalot

+0

相关,虽然不*完全*重复:https://stackoverflow.com/questions/27201086/comparing-string-in-rust/27201198#27201198 –

回答

6

我敢打赌,它不是由类型不匹配造成的。我把我的赌注放在那里有一些不可见的字符(在这种情况下是新行)。为了实现你的目标,你应该修整你的输入字符串:

match name.trim() { 
    "Alice" => println!("Your name is Alice"), 
    "Bob" => println!("Your name is Bob"), 
    _ => println!("Invalid name: {}", name), 
} 
+0

A.B.尚未提交答案,所以我只接受你的答案。 – sircapsalot

相关问题