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

String 是否有一种不那么冗长的方法可以从字符串向量中获取默认字符串?,string,rust,String,Rust,我试过用&str代替字符串,但这有编译错误。我的结局是: 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 =>

我试过用
&str
代替
字符串,但这有编译错误。我的结局是:

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);
}
fn main()
{
让单词:Vec=Vec![“苹果”。to_string(),“橙色”。to_string(),“香蕉”。to_string();
让word:String=匹配单词。get(4)
{
一些=>s.到_字符串()
,None=>“nil”。to_string()
};
println!(“单词:{}”,单词);
}

在决定
&str
字符串
时,记住的强制规则很重要

fn main()
{
让words=vec![“苹果”、“橘子”、“香蕉”];//vec
让word=匹配words.get(2){/&str
一些(&s)=>s
无=>“无”
};
println!(“单词:{}”,单词);
}

如果长度仍然是您关心的问题,您可以合并
单词和
单词
匹配代码,但我认为这(可能包括类型注释)是最简洁的,不会影响清晰度。

我不太确定您想要实现什么,但这可能是实现您在代码中所做工作的最佳方式:

fn main() {
    let words = vec!["apple", "orange", "banana"];
    let word = words.get(4).cloned().unwrap_or("nil").to_string();
    println!("word: {}", word);
}
棘手的部分是
cloned()
get()
方法将返回对向量内部值的可选引用。但由于向量已经包含引用,我们最终得到了
选项
(两个引用)。
cloned()
调用删除一个引用,因此我们有
选项


另外请注意,在本例中,最后的
to_string()
调用是不必要的——我们只能使用
&str

来完成所有操作。有两件事可以立即帮助缩短此程序:

  • 类型推断:您很少需要写出类型
  • &str
    :这里对
    和\u string
    的调用太多了
  • 我会这样写:

    fn main() {
        let words = vec!["apple", "orange", "banana"];
        let word = match words.get(4) {
            Some(&s) => s,
            None => "nil"
        };
        println!("word: {}", word);
    }
    
    请注意,
    Vec::get
    返回一个
    选项,因此这里是一个
    选项
    ,因为我们希望
    s
    类型为
    &str
    (single
    &
    ),所以我们使用
    一些(&s)
    作为模式。另一个选项是
    Some(s)=>*s,
    (这里,让
    s
    be
    &&str
    并取消对它的引用)

    当然,通过查看的特定API,可以进一步减少这一切。有些不太通用,但在Rust中经常使用
    选项
    结果
    (在前奏中有这么多),因此值得学习它们的API

    在这种情况下,
    unwrap\u或
    将提供
    选项
    内的值或传递给它的值:

    fn main() {
        let words = vec!["apple", "orange", "banana"];
        let word = *words.get(4).unwrap_or(&"nil");
        println!("word: {}", word);
    }
    

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

    非常好和清晰。在我第一次尝试使用
    &str
    时,我错过了
    一些(&s)
    。谢谢