这很简单,但我不知道为什么它不起作用。
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;
^~~~~~~~~~~~~
我已经用尽了所有我能想到的组合。我在这里缺少什么?
最佳答案
这是行不通的,因为连接仅在 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;
}
关于rust - 向量元组的字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36650238/