我如何连接string?

如何连接以下types的组合:

  • strstr
  • Stringstr
  • StringString

连接string时,需要分配内存来存储结果。 最简单的就是String&str

 fn main() { let mut owned_string: String = "hello ".to_owned(); let borrowed_string: &str = "world"; owned_string.push_str(borrowed_string); println!("{}", owned_string); } 

在这里,我们有一个我们可以改变的拥有的string。 这是有效的,因为它可能允许我们重新使用内存分配。 StringString也有类似的情况,因为&String 可以被解引用为&str

 fn main() { let mut owned_string: String = "hello ".to_owned(); let another_owned_string: String = "world".to_owned(); owned_string.push_str(&another_owned_string); println!("{}", owned_string); } 

在此之后, another_owned_string是不变的(注意不是mut限定符)。 还有另一个消耗 String变体,但不要求它是可变的。 这是Add String一个实现, String作为左侧, &str作为右侧:

 fn main() { let owned_string: String = "hello ".to_owned(); let borrowed_string: &str = "world"; let new_owned_string = owned_string + borrowed_string; println!("{}", new_owned_string); } 

请注意,在调用+之后, owned_string不再可访问。

如果我们想要产生一个新的string,那么两个都不会改变呢? 最简单的方法是使用format!

 fn main() { let borrowed_string: &str = "hello "; let another_borrowed_string: &str = "world"; let together = format!("{}{}", borrowed_string, another_borrowed_string); println!("{}", together); } 

请注意,两个inputvariables都是不可变的,所以我们知道它们没有被触及。 如果我们想为String任何组合做同样的事情,我们可以使用String也可以被格式化的事实:

 fn main() { let owned_string: String = "hello ".to_owned(); let another_owned_string: String = "world".to_owned(); let together = format!("{}{}", owned_string, another_owned_string); println!("{}", together); } 

你不必使用format! 虽然。 您可以克隆一个string ,并将另一个string附加到新的string:

 fn main() { let owned_string: String = "hello ".to_owned(); let another_owned_string: &str = "world"; let together = owned_string.clone() + another_owned_string; println!("{}", together); } 

注意 – 我所做的所有types规范都是多余的 – 编译器可以在这里推断出所有的types。 我把它们加进来,只是为了让Rust的新手清楚,因为我希望这个问题能够在这个群体中受到欢迎!

要将多个string连接成一个string,并用另一个字符分隔,有几种方法。

我见过的最好的方法是在数组上使用join方法:

 fn main() { let a = "Hello"; let b = "world"; let result = [a, b].join("\n"); print!("{}", result); } 

根据您的使用情况,您可能也更喜欢更多的控制:

 fn main() { let a = "Hello"; let b = "world"; let result = format!("{}\n{}", a, b); print!("{}", result); } 

还有一些我看过的手动方式,有的避免了一两个分配。 为了便于阅读,我发现上面的两个就足够了。