我正在尝试在Rust中编写一个简单的函数,它会询问用户一个期待回答“你”或“我”的问题。它应该返回一个布尔值,或者再次询问用户是否回答错误。我提出了:
fn player_starts() -> bool {
println!("Who will start (me/you)");
loop {
let input = readline::readline(">");
match input {
Some("me") => return true,
Some("you") => return false,
_ => None,
}
}
}
我得到的是:
error: mismatched types:
expected `collections::string::String`,
found `&'static str`
(expected struct `collections::string::String`,
found &-ptr) [E0308]
有没有办法强迫文字在这里工作,还是有更好的方法来实现我的目标?
答案 0 :(得分:12)
这应该有效:
fn player_starts() -> bool {
println!("Who will start me/you)");
loop {
let input = readline::readline(">");
match input.as_ref().map(String::as_ref) {
Some("me") => return true,
Some("you") => return false,
_ => ()
}
}
}
请注意匹配语句中的表达式,我们将Option<String>
转换为Option<&str>
。
答案 1 :(得分:8)
您通常将&str
转换为String
的方式为to_owned
,例如
"me".to_owned()
但是,您无法在String
上进行模式匹配。您可以expect
获得成功,从&str
获得String
然后模式匹配:
fn player_starts() -> bool {
println!("Who will start (me/you)");
loop {
let input = readline::readline(">");
match input.expect("Failed to read line").as_ref() {
"me" => return true,
"you" => return false,
_ => println!("Enter me or you"),
}
}
}