jsa*_*ter 133 string string-concatenation rust
如何连接以下类型组合:
str 和 strString 和 strString 和 StringShe*_*ter 171
连接字符串时,需要分配内存来存储结果.先从最简单的是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);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我们有一个我们可以改变的拥有字符串.这是有效的,因为它可能允许我们重用内存分配.还有一个类似的案例String和String作为&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);
}
Run Code Online (Sandbox Code Playgroud)
在此之后,another_owned_string不受影响(注意没有mut限定词).还有另一个变种消耗的String,但并不要求它是可变的.这是一个特征的实现,Add它采用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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,owned_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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,两个输入变量都是不可变的,因此我们知道它们没有被触及.如果我们想为任何组合做同样的事情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);
}
Run Code Online (Sandbox Code Playgroud)
你不具备使用format!虽然.您可以克隆一个字符串并将另一个字符串附加到新字符串:
fn main() {
let owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";
let together = owned_string.clone() + borrowed_string;
println!("{}", together);
}
Run Code Online (Sandbox Code Playgroud)
注意 - 我所做的所有类型规范都是冗余的 - 编译器可以在这里推断出所有类型.我添加它们只是为了让那些刚接触Rust的人清楚,因为我希望这个问题能够受到这个群体的欢迎!
Sim*_*ead 38
要将多个字符串连接成一个字符串,由另一个字符分隔,有几种方法.
我见过最好的是join在数组上使用该方法:
fn main() {
let a = "Hello";
let b = "world";
let result = [a, b].join("\n");
print!("{}", result);
}
Run Code Online (Sandbox Code Playgroud)
根据您的使用情况,您可能还需要更多控制:
fn main() {
let a = "Hello";
let b = "world";
let result = format!("{}\n{}", a, b);
print!("{}", result);
}
Run Code Online (Sandbox Code Playgroud)
我看到了一些更多的手动方式,有些方法可以避免一两次分配.出于可读性目的,我发现上述两个就足够了.
ASH*_*EEV 23
Rust 中有多种方法可以连接字符串
concat!()):fn main() {
println!("{}", concat!("a", "b"))
}
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是:
AB
push_str()和+运算符):fn main() {
let mut _a = "a".to_string();
let _b = "b".to_string();
let _c = "c".to_string();
_a.push_str(&_b);
println!("{}", _a);
println!("{}", _a + &_c);
}
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是:
AB
美国广播公司
Using format!()):fn main() {
let mut _a = "a".to_string();
let _b = "b".to_string();
let _c = format!("{}{}", _a, _b);
println!("{}", _c);
}
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是:
AB
检查一下并尝试使用Rust playground。
sus*_*ide 17
我认为这种concat方法也+应该在这里提到:
assert_eq!(
("My".to_owned() + " " + "string"),
["My", " ", "string"].concat()
);
Run Code Online (Sandbox Code Playgroud)
还有concat!宏,但仅适用于文字:
let s = concat!("test", 10, 'b', true);
assert_eq!(s, "test10btrue");
Run Code Online (Sandbox Code Playgroud)
RFC 2795 于 2019-10-27 发布:建议支持隐式参数来执行许多人所熟知的“字符串插值”——一种将参数嵌入字符串中以连接它们的方法。
RFC:https : //rust-lang.github.io/rfcs/2795-format-args-implicit-identifiers.html
最新的问题状态可以在这里找到:https : //github.com/rust-lang/rust/issues/67984
在撰写本文时(2020 年 9 月 24 日),我相信此功能应该在 Rust Nightly 版本中可用。
这将允许您通过以下速记进行连接:
format_args!("hello {person}")
Run Code Online (Sandbox Code Playgroud)
它相当于:
format_args!("hello {person}", person=person)
Run Code Online (Sandbox Code Playgroud)
还有“ifmt”包,它提供了自己的字符串插值:
连接两个String:
fn concat_string(a: String, b: String) -> String {
a + &b
}
Run Code Online (Sandbox Code Playgroud)
连接两个&str:
fn concat_str(a: &str, b: &str) -> String {
a.to_string() + b
}
Run Code Online (Sandbox Code Playgroud)