如何从std :: borrow :: Cow <str>获取&str或String?

Zel*_*ahl 7 string concatenation rust

我有一个Cow:

use std::borrow::Cow;  // Cow = clone on write
let example = Cow::from("def")
Run Code Online (Sandbox Code Playgroud)

我想def退出它,以便将它追加到另一个String:

let mut alphabet: String = "ab".to_string();
alphabet.push_str("c");
// here I would like to do:
alphabet.push_str(example);
Run Code Online (Sandbox Code Playgroud)

这不起作用,我没有看到适当的方法Cow来获取&strString退出.

She*_*ter 12

我怎么得到一个 &str

  1. 用途Borrow:

    use std::borrow::Borrow;
    alphabet.push_str(example.borrow());
    
    Run Code Online (Sandbox Code Playgroud)
  2. 用途AsRef:

    alphabet.push_str(example.as_ref());
    
    Run Code Online (Sandbox Code Playgroud)
  3. Deref明确使用:

    use std::ops::Deref;
    alphabet.push_str(example.deref());
    
    Run Code Online (Sandbox Code Playgroud)
  4. Deref通过胁迫隐式使用:

    alphabet.push_str(&example);
    
    Run Code Online (Sandbox Code Playgroud)

我怎么得到一个 String

  1. 用途ToString:

    example.to_string();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 用途Cow::into_owned:

    example.into_owned();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用任何方法获取引用,然后调用to_owned:

    example.as_ref().to_owned();
    
    Run Code Online (Sandbox Code Playgroud)

  • 未来的读者请注意:在“如何获取 `String`”中,`into_owned` 消耗 `Cow` 并仅在 `Cow::Borrowed` 的情况下进行分配,而 `to_string` 和 `as_ref + to_owned` 则保留`Cow` 完好无损并无条件分配。它们与“Cow::Borrowed”等效,但类似于“Cow::Owned”的移动与克隆。 (3认同)

hwi*_*ers 6

传递到一个参考example(即&example),以push_str

let mut alphabet: String = "ab".to_string();
alphabet.push_str("c");  
alphabet.push_str(&example);
Run Code Online (Sandbox Code Playgroud)

这是因为Cow实现了Deref