2016-04-15 67 views
0

這很簡單,但我不知道爲什麼它不起作用。向量元組字符串連接

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

'vector [0] .0 +&vector [0] .1',但它將移出'vector [0] .0' –

回答

3

這不起作用,因爲級聯是在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; 
}