2016-04-15 13 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

'ベクトル[0] 0.0 +&ベクトル[0] .1'、それ'vector [0] .0'から移動します –

答えて

3

連結がStringにのみ定義されているので、これは動作しませんし、それはその左オペランド消費:それは文字列にすることにより、値のアクセスを必要とするため

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

を、それが上のインデックスで行うことができませんvector - 値を参照するのではなく、ベクトルへの参照を返すことができます。

これを克服するためのいくつかの方法は、たとえば、あなたが文字列のクローンを作成することができ、があります。

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; 
}