2016-06-12 7 views
0

私は非常に錆びていて、オーナーシップシステムなどのハングアップを開始していますが、まだハングアップしています。rust:インデックスに登録されたコンテキストから移動することはできません

fn main() { 
    let mut t = vec![Box::new(4)]; 
    let mut o = t[0]; 
    *o = *o + 1; 
    t[0] = o; 
    println!("t[0]:{}", t[0]); 
} 

私がoを初期化していますラインのcannot move out of indexed contentエラーを与える:exmapleのために、私は次のコードを持っています。私はなぜこれが起こっていると考えているのですか?しかし、私は同じことを達成するために代わりにやるべきことを理解できません。これは非常に単純化されたケースですが、どんな助けでも大歓迎です。ありがとう!

+0

スタックオーバーフローに関する他の質問とリンクすることをお勧めします。スタックオーバーフローには、同じエラーメッセージが表示され、質問との相違点が説明されています。 – Shepmaster

+1

これを重複してマークを外していただければ幸いです。他のスレッドの答えはここには当てはまらないようですが、私は '&'演算子を追加しようとしましたが、単にエラーの新しい缶を開きます。さらに、もう一つのスレッドは、私がやろうとしているベクトルの値を再設定することを扱っていません。あなたは以下の答えが非常に異なっているのを見ることができます。 –

+0

絶対に。あなたの質問に他の質問へのリンクを含めて、なぜそれが重複していないのかを記述してください。これは、今後の調​​査者が両方の質問がなぜ必要なのかを理解するのに役立ちます。 – Shepmaster

答えて

4

t[0]は、コンテキストに基づいて*t. index (0)または*t. index_mut (0)のいずれかに相当します。これらのメソッドは、不変参照と可変参照を返します。索引付け演算子は、これらを自動的に逆参照します。

ベクトルがBox<i32>であるため、逆参照は有効ではありません。これは、ベクトルから値を移動しようとするためです。しかし、それでは、その代わりに何をベクトルに入れますか?

値を移動しようとする代わりに、代わりに値への参照を使用する必要があります。また、値に1を追加できるようにするには、Boxへの参照ではなく、その値への参照が必要です。そうでない場合、コンパイラはと訴え、

fn main() { 
    let mut t = vec![Box::new(4)]; 
    { 
     let o = &mut *t[0]; 
     *o = *o + 1; 
    } 
    println!("t[0]:{}", &t[0]); 
} 

私はprintln!前に可変ボローエンドを作るためにここにブロックを追加する必要がありました:あなたは、最初の結果に変更可能な参照を取ることによって、その後、ボックスを逆参照することによってこれを行うことができます。

error: cannot borrow `t` as immutable because it is also borrowed as mutable 

また、我々は直接それへの参照を使用することにより、ベクトルの値を変更したため、我々は、ベクターに戻って更新された値を入れる必要はありませんどのように注意してください。

+0

私は理解していると思う、助けてくれてありがとう! –

関連する問題