date
の値をTimeTravel
に変更しようとしています。コメントはどのような価値があるかを示していますが、それは私が得るものではありません。クロージャの外側の値をクロージャからどのように変更できますか?
use std::cell::Cell;
#[derive(Debug, Clone)]
pub struct TimeTravel {
pub date: Cell<i32>,
}
impl TimeTravel {
pub fn new() -> Self {
TimeTravel { date: Cell::new(1) }
}
pub fn forward(&self) -> &Self {
let d = self.date.get();
self.date.set(d + 1);
self
}
}
fn main() {
let travel: TimeTravel = TimeTravel::new();
println!("{:?}", travel); // 1
travel.forward();
println!("{:?}", travel); // 2
{
let t1 = travel.clone();
let first = || {
t1.forward();
println!("{:?}", t1); // 3
t1.forward();
println!("{:?}", t1); // 4
};
first();
}
{
let t2 = travel.clone();
let second = || {
t2.forward();
println!("{:?}", t2); //5
};
second();
}
}
私はこの
TimeTravel { date: Cell { value: 1 } }
TimeTravel { date: Cell { value: 2 } }
TimeTravel { date: Cell { value: 3 } }
TimeTravel { date: Cell { value: 4 } }
TimeTravel { date: Cell { value: 3 } }
を取得しかし、私は何が起こっているのかを正しく理解していれば、私はt1
とt2
の値を変更し、ないtravel
ています。クロージャ内でtravel
の値を変更するにはどうすればよいですか?
あなたは、あなたがそれをクローニングしている理由travel' '変異させたい場合は? https://play.rust-lang.org/?gist=a7a21ff881217d703b53209307254b88&version=nightlyはうまくいきます。おそらく、あなたの実際のコードはもっと複雑で、クロージャーではもっと複雑なものでしょうか? – loganfsmyth
私は錆の完全な初心者であり、クローニングは "移動"の問題を避けるために、または "既に借りている"またはパニックで走っていないことを知っている唯一の方法です。私は旅行の中で日付を増やして最後のものが5を印刷するようにしたいのですが(参照で?)、私はここで尋ねています。 –
はい、実際のコードはより複雑ですが、これは問題の単純化されたバージョンです。 –