这很简单,但我不知道它为什么不起作用。
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;
^~~~~~~~~~~~~
我已经筋疲力尽了我能想到的所有组合。我在这里缺少什么?
答案 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;
}