我尝试使用&str而不是String,但有编译错误.我结束了:
fn main()
{
let words: Vec<String> = vec!["apple".to_string(), "orange".to_string(), "banana".to_string()];
let word: String = match words.get(4)
{
Some(s) => s.to_string()
, None => "nil".to_string()
};
println!("word: {}", word);
}
Run Code Online (Sandbox Code Playgroud)
有两件事会立即帮助缩短这个计划:
&str:打电话到to_string这里太多了我会把它写成:
fn main() {
let words = vec!["apple", "orange", "banana"];
let word = match words.get(4) {
Some(&s) => s,
None => "nil"
};
println!("word: {}", word);
}
Run Code Online (Sandbox Code Playgroud)
注意Vec<T>::get返回一个Option<&T>,因此这里是一个Option<&&str>,因为我们想要s类型&str(单个&),我们Some(&s)用作模式.另一个选择是Some(s) => *s,(在这里,s进行&&str和解除引用).
当然,通过查看特定的API,可以进一步减少这一点Option.稍差普及,但Option和Result非常频繁拉斯特使用(这么多,他们都在前奏!),因此这是值得学习他们的API.
在这种情况下,unwrap_or将提供内部值Option或传递给它的值:
fn main() {
let words = vec!["apple", "orange", "banana"];
let word = *words.get(4).unwrap_or(&"nil");
println!("word: {}", word);
}
Run Code Online (Sandbox Code Playgroud)
一点点参考杂耍排列类型(又名俄罗斯方块),这一切都很好.