struct MyCell<T> {
value: T
}
impl<T> MyCell<T> {
fn new(value: T) -> Self {
MyCell { value }
}
fn get(&self) -> &T {
&self.value
}
fn set(&self, new_value: T) {
unsafe {
*(&self.value as *const T as *mut T) = new_value;
}
}
}
fn set_to_local(cell: &MyCell<&i32>) {
let local = 100;
cell.set(&local);
}
fn main() {
let cell = MyCell::new(&10);
set_to_local(&cell);
}
を呼び出すと、 isおよびiscell.set(&local)
と仮定すると、共分散規則により の型がからに変更されると言われます。cell
'x
'&local
'y
cell
&MyCell<'x, &i32>
&MyCell<'y, &i32>
unsafe ブロック内の割り当ては、 のパラメーターの有効期間の推定にどのように影響しますset()
か? 生のポインターには有効期間がありません。コンパイラは、共分散を使用して同じ有効期間を作成し、同じ有効期間を持つ必要があることをどのように認識しcell
ますnew_value
か?