我如何连接string?
如何连接以下types的组合:
-
str
和str
-
String
和str
-
String
和String
连接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。 这是有效的,因为它可能允许我们重新使用内存分配。 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); }
在此之后, 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); }
还有一些我看过的手动方式,有的避免了一两个分配。 为了便于阅读,我发现上面的两个就足够了。