我在TimeTravel
中嘗試更改date
的值。評論表明我想要什麼樣的價值,但這不是我得到的。如何從閉包修改閉包之外的值?
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=每夜工作得很好。也許你真正的代碼更復雜,並且用閉包做更復雜的事情? – loganfsmyth
因爲我是一個完整的生鏽初學者,克隆是我知道避免「移動」問題的唯一途徑,或者不是在「已借」或恐慌中跑步。我想在旅行中增加日期,所以最後一個會打印5(通過引用?),這就是我在這裏問的原因。 –
是的,真正的代碼更復雜,這是一個簡化版本的問題。 –