如何连接字符串?

时间:2015-05-10 17:40:20

标签: string rust string-concatenation

如何连接以下类型组合:

  • strstr
  • Stringstr
  • StringString

5 个答案:

答案 0 :(得分:144)

连接字符串时,需要分配内存来存储结果。最简单的开始是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);
}

在这里,我们有一个我们可以改变的拥有字符串。这是有效的,因为它可能允许我们重用内存分配。 StringString的情况与&String can be dereferenced as &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的另一个变体,但并不要求它是可变的。这是一个implementation of the Add trait,左侧为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后无法再访问+

如果我们想要生成一个新的字符串,两者都保持不变,该怎么办?最简单的方法是使用format!

fn main() {
    let borrowed_string: &str = "hello ";
    let another_borrowed_string: &str = "world";

    let together = format!("{}{}", borrowed_string, another_borrowed_string);
    println!("{}", together);
}

请注意,两个输入变量都是不可变的,因此我们知道它们没有被触及。如果我们想对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);
}

您可以clone one string并将另一个字符串附加到新字符串:

format!

注意 - 我所做的所有类型规范都是多余的 - 编译器可以在这里推断出所有类型。我添加它们只是为了让那些刚接触Rust的人清楚,因为我希望这个问题能够受到该群体的欢迎!

答案 1 :(得分:30)

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

我见过最好的是在数组上使用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);
}

我看到了一些更多的手动方式,有些方法可以避免一两次分配。出于可读性目的,我发现上述两个就足够了。

答案 2 :(得分:9)

在RUST中连接字符串的简单方法

RUST中有多种方法可以连接字符串

第一种方法(使用concat!()):

fn main() {
    println!("{}", concat!("a", "b"))
}

以上代码的输出为:

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 + &_b);
}

以上代码的输出为:

ab

abc


第三种方法(Using format!()):

fn main() {
    let mut _a = "a".to_string();
    let _b = "b".to_string();
    let _c = format!("{}{}", _a, _b);
    
    println!("{}", _c);
}

以上代码的输出为:

ab

查看并尝试Rust play ground

答案 3 :(得分:2)

2020年更新:通过字符串插值进行串联

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}")

等效于此:

format_args!("hello {person}", person=person)

还有“ ifmt”板条箱,它提供了自己的一种字符串插值方式:

https://crates.io/crates/ifmt

答案 4 :(得分:1)

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

assert_eq!(
  ("My".to_owned() + " " + "string"),
  ["My", " ", "string"].concat()
);

还有concat!宏,但仅用于文字:

let s = concat!("test", 10, 'b', true);
assert_eq!(s, "test10btrue");