从矢量元组的字符串连接

时间:2016-04-15 14:43:08

标签: rust

这很简单,但我不知道它为什么不起作用。

fn main() {
    let vector = vec![("foo".to_string(), "bar".to_string())];
    let string = vector[0].0 + vector[0].1;
}

错误

src/main.rs:3:29: 3:40 error: mismatched types:
 expected `&str`,
    found `collections::string::String`
(expected &-ptr,
    found struct `collections::string::String`) [E0308]
src/main.rs:3   let string = vector[0].0 + vector[0].1;
                                           ^~~~~~~~~~~

然后我将其更改为:

fn main() {
    let vector = vec![("foo".to_string(), "bar".to_string())];
    let string = &*vector[0].0 + &*vector[0].1;
}

获取其他错误

src/main.rs:3:15: 3:28 error: binary operation `+` cannot be applied to type `&str` [E0369]
src/main.rs:3   let string = &*vector[0].0 + &*vector[0].1;
                             ^~~~~~~~~~~~~
src/main.rs:3:15: 3:28 help: run `rustc --explain E0369` to see a detailed explanation
src/main.rs:3:15: 3:28 note: an implementation of `std::ops::Add` might be missing for `&str`
src/main.rs:3   let string = &*vector[0].0 + &*vector[0].1;
                             ^~~~~~~~~~~~~

我已经筋疲力尽了我能想到的所有组合。我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

这不起作用,因为连接仅在String上定义,并且它使用左操作数:

let s = "hello ".to_string();
let c = s + "world";
println!("{}", c);  // hello world
println!("{}", s);  // compilation error

因此它需要对字符串进行按值访问,但不能通过对向量进行索引来完成 - 它们只能将引用返回到向量中,而不是值。

有几种方法可以解决这个问题,例如,您可以克隆字符串:

let string = vector[0].0.clone() + &vector[0].1;

或者您可以使用格式:

let string = format!("{}{}", vector[0].0, vector[0].1);

或者您可以使用remove()swap_remove()从矢量中取出值:

let string = match vector.swap_remove(0) {
    (left, right) => left + right
};

后者自然是合适的,如果你可以失去矢量的状态。如果你想对整个向量执行此操作,最好按值迭代它,在此过程中使用它:

for (left, right) in vector {
    let string = left + right;
}