从字符串向量中获取默认字符串是否有一种不那么冗长的方法?

shi*_*kou 0 string rust

我尝试使用&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)

Mat*_* M. 5

有两件事会立即帮助缩短这个计划:

  1. 类型推断:你很少需要写出类型
  2. &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.稍差普及,但OptionResult非常频繁拉斯特使用(这么多,他们都在前奏!),因此这是值得学习他们的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)

一点点参考杂耍排列类型(又名俄罗斯方块),这一切都很好.