String 如何连接字符串?

String 如何连接字符串?,string,rust,string-concatenation,String,Rust,String Concatenation,如何连接以下类型组合: str和str String和str String和String 连接字符串时,需要分配内存来存储结果。最简单的开始是String和&str: fn main(){ 让mut拥有\u string:string=“hello”; 让我们借用字符串:&str=“world”; 自有字符串。推字符串(借用字符串); println!(“{}”,拥有的字符串); } 在这里,我们拥有一个可以变异的字符串。这是有效的,因为它可能允许我们重用内存分配。String和String

如何连接以下类型组合:

  • str
    str
  • String
    str
  • String
    String

连接字符串时,需要分配内存来存储结果。最简单的开始是
String
&str

fn main(){
让mut拥有\u string:string=“hello”;
让我们借用字符串:&str=“world”;
自有字符串。推字符串(借用字符串);
println!(“{}”,拥有的字符串);
}
在这里,我们拥有一个可以变异的字符串。这是有效的,因为它可能允许我们重用内存分配。
String
String
的情况与
&String
类似

fn main(){
让mut拥有\u string:string=“hello”;
让另一个拥有的字符串:string=“world”。to_owned();
拥有的字符串。推送字符串(&另一个拥有的字符串);
println!(“{}”,拥有的字符串);
}
在此之后,
另一个\u拥有的\u字符串
未被触动(注意:没有
mut
限定符)。还有另一个变体使用
字符串
,但不要求它是可变的。这是一个将
字符串
作为左侧,将
&str
作为右侧的字符串:

fn main(){
let owned_string:string=“hello”。to_owned();
让我们借用字符串:&str=“world”;
让新的\u拥有的\u字符串=拥有的\u字符串+借用的\u字符串;
println!(“{}”,新的字符串);
}
请注意,调用
+
后,无法再访问
拥有的\u字符串

如果我们想产生一个新的字符串,让两者都保持不变呢?最简单的方法是使用:

fn main(){
让我们来看看字符串:&str=“hello”;
让另一个字符串:&str=“world”;
let together=format!(“{}{}”,借来的字符串,另一个借来的字符串);
//之后https://rust-lang.github.io/rfcs/2795-format-args-implicit-identifiers.html
//let together=format!(“{借用的字符串}{另一个借用的字符串}”);
println!(“{}”,一起);
}
请注意,这两个输入变量都是不可变的,因此我们知道它们不会被触及。如果我们想对
字符串
的任何组合执行相同的操作,我们可以使用
字符串
也可以格式化的事实:

fn main(){
let owned_string:string=“hello”。to_owned();
让另一个拥有的字符串:string=“world”。to_owned();
let together=format!(“{}{}”,拥有的_字符串,另一个_拥有的_字符串);
//之后https://rust-lang.github.io/rfcs/2795-format-args-implicit-identifiers.html
//let together=format!(“{owned_string}{other_owned_string}”);
println!(“{}”,一起);
}
您不必使用
格式不过。您可以将另一个字符串添加并附加到新字符串:

fn main(){
let owned_string:string=“hello”。to_owned();
让我们借用字符串:&str=“world”;
let together=owned_string.clone()+借用的_string;
println!(“{}”,一起);
}

注意-我所做的所有类型规范都是多余的-编译器可以推断出这里使用的所有类型。我添加这些问题只是为了让不熟悉锈蚀的人明白,因为我希望这个问题会受到该群体的欢迎

要将多个字符串连接成一个由另一个字符分隔的字符串,有两种方法

我见过的最好的方法是在数组上使用
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);
}
我见过一些更为手动的方法,有些方法在这里或那里避免一到两次分配。为了便于阅读,我认为以上两种方法已经足够了。

我认为这里也应该提到方法和
+

assert\u eq!(
(“My.to_owned()+“”+“string”),
[“我的”、“字符串”]。concat()
);
还有宏,但仅适用于文本:

s=concat!(“测试”,10,'b',正确);
断言!(s,“Test10b真实”);
在Rust中连接字符串的简单方法 Rust中有多种方法可用于连接字符串

第一种方法(使用
concat!()
): 上述代码的输出为:

ab


第二种方法(使用
push_str()
+
运算符): 上述代码的输出为:

ab

abc


第三种方法(
使用格式!()
): 上述代码的输出为:

ab


查看它并试用。

2020更新:通过字符串插值进行连接

2019年10月27日发布的RFC 2795: 建议支持隐式参数,以实现许多人所知的“字符串插值”——一种在字符串中嵌入参数以连接参数的方法

RFC:

可在此处找到最新问题状态:

在撰写本文时(2020年9月24日),我相信Rust Nightly build中应该有此功能

这将允许您通过以下速记连接:

format_args!("hello {person}")
这相当于:

format_args!("hello {person}", person=person)
还有“ifmt”板条箱,它提供了自己的字符串插值类型:


请注意,
str
&str
是不同的类型,在99%的情况下,您只需要关心
&str
。还有其他问题详细说明了它们之间的区别。这是否回答了您的问题?您如何看待
添加
/
+
符号?如果你想的话,你可以把它写下来。也许这很简单,但是理解它需要查看“使用字符串添加”的可能类型签名。谢谢!您是否能够更深入地了解&String如何作为&str解除引用?它的实现的哪一部分允许这样做,和/或它在文档中的什么地方这样说?@jsalter这是
fn main() {
    let mut _a = "a".to_string();
    let _b = "b".to_string();
    let _c = format!("{}{}", _a, _b);

    println!("{}", _c);
}
format_args!("hello {person}")
format_args!("hello {person}", person=person)